@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
|
@@ -6,23 +6,28 @@ import {
|
|
|
6
6
|
type ZLinkFanoutPublisherDescriptor,
|
|
7
7
|
type ZLinkLocationOwnerToken
|
|
8
8
|
} from '../../contracts/Locations';
|
|
9
|
-
import type { ZLinkFanoutLocationStore } from '../locations/internal-store-contracts';
|
|
10
9
|
import {
|
|
11
10
|
zlinkRuntimeDefaultLocationOptions,
|
|
12
11
|
type ZLinkLocationOptionOverrides
|
|
13
12
|
} from '../../contracts/Locations/Options';
|
|
14
|
-
import
|
|
15
|
-
import { ZLinkConfigurationException } from '../configuration';
|
|
16
|
-
import type { ZLinkLocationRuntime, ZLinkLocationRuntimeStores } from '../locations';
|
|
13
|
+
import { ZLINK_PROVIDER_MAX_PAGE_SIZE } from '../../contracts/Locations/Stores';
|
|
17
14
|
import type { ZLinkBackendSubscriberSocket } from '../backend/contracts';
|
|
18
|
-
import {
|
|
15
|
+
import { type ZLinkFrameworkRegistration, ZLinkConfigurationException } from '../configuration';
|
|
16
|
+
|
|
19
17
|
import { ZLinkStateLane } from '../execution/state-lane';
|
|
18
|
+
import { discoveryAvailabilityForRuntimeState } from '../foundation/runtime-state-projections';
|
|
19
|
+
import { closeResources, finishResourceCleanup } from '../foundation/event-loop-resources';
|
|
20
|
+
import type { ZLinkLocationRuntime, ZLinkLocationRuntimeStores } from '../locations';
|
|
21
|
+
import type { ZLinkFanoutLocationStore } from '../locations/internal-store-contracts';
|
|
22
|
+
import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
|
|
20
23
|
|
|
21
|
-
interface
|
|
24
|
+
interface FanoutTarget {
|
|
22
25
|
descriptor: ZLinkFanoutPublisherDescriptor;
|
|
26
|
+
connection?: ActiveFanoutConnection;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface ActiveFanoutConnection {
|
|
23
30
|
readonly connectionId: string;
|
|
24
|
-
readonly subscriber: ZLinkBackendSubscriberSocket;
|
|
25
|
-
reconnectEligible: boolean;
|
|
26
31
|
stopReceiver: () => Promise<void>;
|
|
27
32
|
state: 'connecting' | 'ready';
|
|
28
33
|
}
|
|
@@ -39,7 +44,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
39
44
|
readonly lifecycleGeneration: bigint;
|
|
40
45
|
}
|
|
41
46
|
>();
|
|
42
|
-
private readonly
|
|
47
|
+
private readonly targets = new Map<string, FanoutTarget>();
|
|
43
48
|
private controller?: AbortController;
|
|
44
49
|
private timer?: NodeJS.Timeout;
|
|
45
50
|
|
|
@@ -95,18 +100,49 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
95
100
|
return current;
|
|
96
101
|
});
|
|
97
102
|
if (timer !== undefined) clearTimeout(timer);
|
|
98
|
-
const
|
|
99
|
-
await Promise.allSettled(
|
|
100
|
-
|
|
103
|
+
const targets = await this.lane.run(() => [...this.targets]);
|
|
104
|
+
const targetResults = await Promise.allSettled(
|
|
105
|
+
targets.map(([id, target]) => this.removeTarget(id, target))
|
|
106
|
+
);
|
|
107
|
+
const publisherResults = await Promise.allSettled([this.removeLocalPublishers(signal)]);
|
|
108
|
+
finishResourceCleanup(
|
|
109
|
+
[...targetResults, ...publisherResults].flatMap((result) =>
|
|
110
|
+
result.status === 'rejected' ? [result.reason] : []
|
|
111
|
+
)
|
|
112
|
+
);
|
|
101
113
|
}
|
|
102
114
|
|
|
103
115
|
activeTargets(channelName: string): readonly ZLinkFanoutPublisherDescriptor[] {
|
|
104
|
-
return [...this.
|
|
105
|
-
.filter((target) => target.state === 'ready')
|
|
116
|
+
return [...this.targets.values()]
|
|
117
|
+
.filter((target) => target.connection?.state === 'ready')
|
|
106
118
|
.map((target) => target.descriptor)
|
|
107
119
|
.filter((descriptor) => descriptor.channelName === channelName);
|
|
108
120
|
}
|
|
109
121
|
|
|
122
|
+
topologyTargets(channelName: string) {
|
|
123
|
+
if (!this.isAutomaticSubscriber(channelName)) return undefined;
|
|
124
|
+
return [...this.targets.values()]
|
|
125
|
+
.filter((target) => target.descriptor.channelName === channelName)
|
|
126
|
+
.map((target) => ({
|
|
127
|
+
channelName,
|
|
128
|
+
publisherRoutingId: String(target.descriptor.publisherRid),
|
|
129
|
+
lifecycleGeneration: target.descriptor.lifecycleGeneration,
|
|
130
|
+
descriptorRevision: target.descriptor.descriptorRevision,
|
|
131
|
+
advertisedEndpoint: target.descriptor.endpoint,
|
|
132
|
+
state:
|
|
133
|
+
target.descriptor.state === ZLinkFrameworkRuntimeState.Serving
|
|
134
|
+
? target.connection?.state === 'ready'
|
|
135
|
+
? ('serving' as const)
|
|
136
|
+
: ('preparing' as const)
|
|
137
|
+
: discoveryAvailabilityForRuntimeState(target.descriptor.state)
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private isAutomaticSubscriber(channelName: string): boolean {
|
|
142
|
+
const subscriber = this.registration.channels.get(channelName)?.subscriber;
|
|
143
|
+
return subscriber !== undefined && (subscriber.manualConnections?.length ?? 0) === 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
110
146
|
async reclaimOwnerRows(signal?: AbortSignal): Promise<void> {
|
|
111
147
|
const owner = this.requireOwnerToken();
|
|
112
148
|
const descriptors = await this.lane.run(() => [...this.localDescriptors]);
|
|
@@ -215,74 +251,87 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
215
251
|
}
|
|
216
252
|
|
|
217
253
|
private async reconcileSubscribers(signal?: AbortSignal): Promise<void> {
|
|
218
|
-
for (const
|
|
219
|
-
if (
|
|
220
|
-
|
|
221
|
-
(channel.subscriber.manualConnections?.length ?? 0) > 0
|
|
222
|
-
) {
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
254
|
+
for (const channelName of this.registration.channels.keys()) {
|
|
255
|
+
if (!this.isAutomaticSubscriber(channelName)) continue;
|
|
256
|
+
const previous = this.topologyTargets(channelName)!;
|
|
225
257
|
const rows = await this.listLivePublishers(channelName, signal);
|
|
226
258
|
const desired = new Map(rows.map((row) => [fanoutConnectionId(row), row]));
|
|
227
259
|
for (const [connectionId, descriptor] of desired) {
|
|
228
|
-
|
|
260
|
+
let current = await this.lane.run(() => this.targets.get(connectionId));
|
|
229
261
|
if (current === undefined) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
if (descriptor.descriptorRevision < current.descriptor.descriptorRevision) {
|
|
262
|
+
const created = { descriptor };
|
|
263
|
+
current = created;
|
|
264
|
+
await this.lane.run(() => this.targets.set(connectionId, created));
|
|
265
|
+
} else if (descriptor.descriptorRevision < current.descriptor.descriptorRevision) {
|
|
234
266
|
continue;
|
|
235
|
-
}
|
|
236
|
-
if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
|
|
267
|
+
} else if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
|
|
237
268
|
if (!sameFanoutDescriptor(descriptor, current.descriptor)) {
|
|
238
|
-
await this.
|
|
269
|
+
await this.removeTarget(connectionId, current);
|
|
270
|
+
continue;
|
|
239
271
|
}
|
|
272
|
+
} else if (!sameFanoutImmutableIdentity(descriptor, current.descriptor)) {
|
|
273
|
+
await this.removeTarget(connectionId, current);
|
|
240
274
|
continue;
|
|
275
|
+
} else {
|
|
276
|
+
const target = current;
|
|
277
|
+
await this.lane.run(() => {
|
|
278
|
+
if (this.targets.get(connectionId) === target) target.descriptor = descriptor;
|
|
279
|
+
});
|
|
280
|
+
if (current.connection?.state === 'ready') {
|
|
281
|
+
this.sockets.admitFanoutPublisher(current.descriptor, connectionId);
|
|
282
|
+
}
|
|
241
283
|
}
|
|
242
|
-
|
|
243
|
-
await this.closeConnection(connectionId);
|
|
244
|
-
continue;
|
|
245
|
-
}
|
|
246
|
-
await this.lane.run(() => {
|
|
247
|
-
if (this.connections.get(connectionId) === current) current.descriptor = descriptor;
|
|
248
|
-
});
|
|
249
|
-
if (current.state === 'ready') {
|
|
250
|
-
this.sockets.admitFanoutPublisher(descriptor, connectionId);
|
|
251
|
-
}
|
|
284
|
+
await this.reconcileConnection(connectionId, current);
|
|
252
285
|
}
|
|
253
|
-
const
|
|
254
|
-
for (const [connectionId, current] of
|
|
286
|
+
const targets = await this.lane.run(() => [...this.targets]);
|
|
287
|
+
for (const [connectionId, current] of targets) {
|
|
255
288
|
if (current.descriptor.channelName === channelName && !desired.has(connectionId)) {
|
|
256
|
-
await this.
|
|
289
|
+
await this.removeTarget(connectionId, current);
|
|
257
290
|
}
|
|
258
291
|
}
|
|
292
|
+
const next = this.topologyTargets(channelName)!;
|
|
293
|
+
if (
|
|
294
|
+
previous.length !== next.length ||
|
|
295
|
+
previous.some(
|
|
296
|
+
(publisher, index) =>
|
|
297
|
+
publisher.publisherRoutingId !== next[index]!.publisherRoutingId ||
|
|
298
|
+
publisher.state !== next[index]!.state
|
|
299
|
+
)
|
|
300
|
+
) {
|
|
301
|
+
this.sockets.notifyFanoutTopology(channelName);
|
|
302
|
+
}
|
|
259
303
|
}
|
|
260
304
|
}
|
|
261
305
|
|
|
262
|
-
private async
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
306
|
+
private async reconcileConnection(connectionId: string, target: FanoutTarget): Promise<void> {
|
|
307
|
+
if (target.descriptor.state !== ZLinkFrameworkRuntimeState.Serving) {
|
|
308
|
+
await this.closeConnection(target);
|
|
309
|
+
} else if (target.connection === undefined) {
|
|
310
|
+
await this.openConnection(connectionId, target);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
private async openConnection(connectionId: string, target: FanoutTarget): Promise<void> {
|
|
315
|
+
const descriptor = target.descriptor;
|
|
316
|
+
let connection: ActiveFanoutConnection | undefined;
|
|
267
317
|
const subscriber = this.sockets.openFanoutSubscriberConnection(
|
|
268
318
|
descriptor.channelName,
|
|
269
319
|
connectionId,
|
|
270
320
|
descriptor.endpoint,
|
|
271
321
|
{
|
|
272
322
|
onReady: () => {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
this.sockets.admitFanoutPublisher(descriptor, connectionId);
|
|
323
|
+
if (connection !== undefined && target.connection === connection) {
|
|
324
|
+
connection.state = 'ready';
|
|
325
|
+
this.sockets.admitFanoutPublisher(target.descriptor, connectionId);
|
|
277
326
|
}
|
|
278
327
|
},
|
|
279
328
|
onTerminated: () => {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
329
|
+
if (connection !== undefined && target.connection === connection) {
|
|
330
|
+
this.sockets.removeFanoutPublisher(target.descriptor, connectionId);
|
|
331
|
+
connection.state = 'connecting';
|
|
332
|
+
const terminated = connection;
|
|
284
333
|
setImmediate(() => {
|
|
285
|
-
void this.replaceConnection(
|
|
334
|
+
void this.replaceConnection(target, terminated).catch((error) =>
|
|
286
335
|
this.locationRuntime.reportDiscoveryFailure(error)
|
|
287
336
|
);
|
|
288
337
|
});
|
|
@@ -290,50 +339,76 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
290
339
|
}
|
|
291
340
|
}
|
|
292
341
|
);
|
|
293
|
-
|
|
294
|
-
descriptor,
|
|
342
|
+
connection = {
|
|
295
343
|
connectionId,
|
|
296
|
-
subscriber,
|
|
297
|
-
reconnectEligible: true,
|
|
298
344
|
stopReceiver: async () => {},
|
|
299
345
|
state: 'connecting'
|
|
300
346
|
};
|
|
301
|
-
|
|
302
|
-
|
|
347
|
+
const opened = connection;
|
|
348
|
+
await this.lane.run(() => (target.connection = opened));
|
|
349
|
+
connection.stopReceiver = this.onSubscriberOpened(
|
|
350
|
+
descriptor.channelName,
|
|
351
|
+
connectionId,
|
|
352
|
+
subscriber
|
|
353
|
+
);
|
|
303
354
|
}
|
|
304
355
|
|
|
305
|
-
private async
|
|
306
|
-
const
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
this.connections.delete(connectionId);
|
|
311
|
-
}
|
|
312
|
-
return target;
|
|
356
|
+
private async removeTarget(connectionId: string, target: FanoutTarget): Promise<void> {
|
|
357
|
+
const detached = await this.lane.run(() => {
|
|
358
|
+
if (this.targets.get(connectionId) !== target) return undefined;
|
|
359
|
+
this.targets.delete(connectionId);
|
|
360
|
+
return this.detachConnection(target);
|
|
313
361
|
});
|
|
362
|
+
await this.closeDetachedConnection(target.descriptor, detached);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
private async closeConnection(target: FanoutTarget): Promise<void> {
|
|
366
|
+
const detached = await this.lane.run(() => this.detachConnection(target));
|
|
367
|
+
await this.closeDetachedConnection(target.descriptor, detached);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
private detachConnection(target: FanoutTarget): ActiveFanoutConnection | undefined {
|
|
371
|
+
const connection = target.connection;
|
|
372
|
+
target.connection = undefined;
|
|
373
|
+
return connection;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
private async closeDetachedConnection(
|
|
377
|
+
descriptor: ZLinkFanoutPublisherDescriptor,
|
|
378
|
+
current: ActiveFanoutConnection | undefined
|
|
379
|
+
): Promise<void> {
|
|
314
380
|
if (current === undefined) return;
|
|
315
|
-
this.sockets.removeFanoutPublisher(
|
|
316
|
-
await
|
|
317
|
-
|
|
381
|
+
this.sockets.removeFanoutPublisher(descriptor, current.connectionId);
|
|
382
|
+
await closeResources([
|
|
383
|
+
{ close: () => current.stopReceiver() },
|
|
384
|
+
{ close: () => this.sockets.closeFanoutSubscriberConnection(current.connectionId) }
|
|
385
|
+
]);
|
|
318
386
|
}
|
|
319
387
|
|
|
320
|
-
private async replaceConnection(
|
|
388
|
+
private async replaceConnection(
|
|
389
|
+
target: FanoutTarget,
|
|
390
|
+
expected: ActiveFanoutConnection
|
|
391
|
+
): Promise<void> {
|
|
321
392
|
const prepared = await this.lane.run(() => {
|
|
322
393
|
const controller = this.controller;
|
|
323
394
|
if (
|
|
324
|
-
this.
|
|
325
|
-
|
|
395
|
+
this.targets.get(expected.connectionId) !== target ||
|
|
396
|
+
target.connection !== expected ||
|
|
326
397
|
controller === undefined
|
|
327
398
|
)
|
|
328
399
|
return undefined;
|
|
329
|
-
return
|
|
400
|
+
return controller;
|
|
330
401
|
});
|
|
331
402
|
if (prepared === undefined) {
|
|
332
403
|
return;
|
|
333
404
|
}
|
|
334
|
-
await this.closeConnection(
|
|
335
|
-
if (
|
|
336
|
-
await this.
|
|
405
|
+
await this.closeConnection(target);
|
|
406
|
+
if (
|
|
407
|
+
await this.lane.run(
|
|
408
|
+
() => this.controller === prepared && this.targets.get(expected.connectionId) === target
|
|
409
|
+
)
|
|
410
|
+
) {
|
|
411
|
+
await this.reconcileConnection(expected.connectionId, target);
|
|
337
412
|
}
|
|
338
413
|
}
|
|
339
414
|
|
|
@@ -346,7 +421,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
346
421
|
do {
|
|
347
422
|
const page = await this.store.listFanoutPublishers(
|
|
348
423
|
channelName,
|
|
349
|
-
{ pageSize:
|
|
424
|
+
{ pageSize: ZLINK_PROVIDER_MAX_PAGE_SIZE, continuationToken },
|
|
350
425
|
signal
|
|
351
426
|
);
|
|
352
427
|
rows.push(...page.items);
|
|
@@ -354,7 +429,6 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
354
429
|
} while (continuationToken !== undefined);
|
|
355
430
|
const live: ZLinkFanoutPublisherDescriptor[] = [];
|
|
356
431
|
for (const descriptor of rows) {
|
|
357
|
-
if (descriptor.state !== ZLinkFrameworkRuntimeState.Serving) continue;
|
|
358
432
|
const lease = await this.storeOwnerLease(descriptor.ownerId, signal);
|
|
359
433
|
if (
|
|
360
434
|
lease.kind === 'found' &&
|
|
@@ -375,17 +449,24 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
375
449
|
const owner = this.locationRuntime.currentOwnerToken;
|
|
376
450
|
if (owner === undefined) return;
|
|
377
451
|
const descriptors = await this.lane.run(() => [...this.localDescriptors.values()]);
|
|
378
|
-
|
|
379
|
-
await
|
|
380
|
-
{
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
452
|
+
try {
|
|
453
|
+
await closeResources(
|
|
454
|
+
descriptors.map((descriptor) => ({
|
|
455
|
+
close: async () => {
|
|
456
|
+
await this.store.removeFanoutPublisher(
|
|
457
|
+
{
|
|
458
|
+
channelName: descriptor.channelName,
|
|
459
|
+
publisherRid: descriptor.publisherRid
|
|
460
|
+
},
|
|
461
|
+
owner,
|
|
462
|
+
signal
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
}))
|
|
386
466
|
);
|
|
467
|
+
} finally {
|
|
468
|
+
await this.lane.run(() => this.localDescriptors.clear());
|
|
387
469
|
}
|
|
388
|
-
await this.lane.run(() => this.localDescriptors.clear());
|
|
389
470
|
}
|
|
390
471
|
|
|
391
472
|
private requireOwnerToken(): ZLinkLocationOwnerToken {
|
|
@@ -3,7 +3,7 @@ import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-
|
|
|
3
3
|
import { ZLinkConfigurationException } from '../configuration';
|
|
4
4
|
import { ZLinkChannelMessageKind } from './channel-envelope';
|
|
5
5
|
|
|
6
|
-
const SPOT_DIRECT_ENVELOPE = 'zlink.framework.spot-direct.v1';
|
|
6
|
+
export const SPOT_DIRECT_ENVELOPE = 'zlink.framework.spot-direct.v1';
|
|
7
7
|
|
|
8
8
|
export function encodeSpotDirectEnvelope(
|
|
9
9
|
kind: ZLinkChannelMessageKind.Request | ZLinkChannelMessageKind.Command,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
|
|
1
2
|
import type { Message } from '../../contracts/Common/Message';
|
|
2
3
|
import type { ZLinkFrameworkRegistration } from '../configuration';
|
|
3
4
|
import { awaitWithAbort, throwIfAborted } from '../abort';
|
|
@@ -44,7 +45,8 @@ export class ZLinkSpotNodeRouteTransport {
|
|
|
44
45
|
if (router === undefined) {
|
|
45
46
|
return undefined;
|
|
46
47
|
}
|
|
47
|
-
const effectiveTimeoutMs =
|
|
48
|
+
const effectiveTimeoutMs =
|
|
49
|
+
timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
48
50
|
throwIfAborted(signal);
|
|
49
51
|
const operation = router.requestToSpot(
|
|
50
52
|
target.targetNodeRid,
|
|
@@ -74,7 +76,8 @@ export class ZLinkSpotNodeRouteTransport {
|
|
|
74
76
|
if (router === undefined) {
|
|
75
77
|
return undefined;
|
|
76
78
|
}
|
|
77
|
-
const effectiveTimeoutMs =
|
|
79
|
+
const effectiveTimeoutMs =
|
|
80
|
+
timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
78
81
|
throwIfAborted(signal);
|
|
79
82
|
const operation = router.requestToSpot(
|
|
80
83
|
target.targetNodeRid,
|
|
@@ -1,4 +1,39 @@
|
|
|
1
|
-
|
|
1
|
+
import {
|
|
2
|
+
ZLinkFrameworkErrorKind,
|
|
3
|
+
ZLinkFrameworkException
|
|
4
|
+
} from '../../contracts/Errors/ZLinkFrameworkException';
|
|
5
|
+
import { ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason } from '../../contracts/Dispatch/ZLinkDispatchOptions';
|
|
6
|
+
import {
|
|
7
|
+
internalFrameworkErrorKind,
|
|
8
|
+
ZLinkFrameworkInternalErrorKind
|
|
9
|
+
} from '../framework-errors-internal';
|
|
10
|
+
|
|
11
|
+
export function dispatchReasonFromError(error: unknown): ZLinkDispatchErrorReason {
|
|
12
|
+
if (!(error instanceof ZLinkFrameworkException)) return ZLinkDispatchErrorReason.HandlerException;
|
|
13
|
+
const origin = internalFrameworkErrorKind(error);
|
|
14
|
+
if (origin === ZLinkFrameworkInternalErrorKind.PayloadDecodeFailed)
|
|
15
|
+
return ZLinkDispatchErrorReason.PayloadDecodeFailed;
|
|
16
|
+
if (
|
|
17
|
+
origin === ZLinkFrameworkInternalErrorKind.SpotGenerationStale ||
|
|
18
|
+
origin === ZLinkFrameworkInternalErrorKind.ActorGenerationStale ||
|
|
19
|
+
origin === ZLinkFrameworkInternalErrorKind.SpotMoving ||
|
|
20
|
+
origin === ZLinkFrameworkInternalErrorKind.ActorMoving ||
|
|
21
|
+
origin === ZLinkFrameworkInternalErrorKind.ActorLocationStale
|
|
22
|
+
)
|
|
23
|
+
return ZLinkDispatchErrorReason.StaleTarget;
|
|
24
|
+
switch (error.kind) {
|
|
25
|
+
case ZLinkFrameworkErrorKind.NotFound:
|
|
26
|
+
return ZLinkDispatchErrorReason.HandlerMissing;
|
|
27
|
+
case ZLinkFrameworkErrorKind.ProtocolError:
|
|
28
|
+
return ZLinkDispatchErrorReason.InvalidFrame;
|
|
29
|
+
case ZLinkFrameworkErrorKind.ShuttingDown:
|
|
30
|
+
return ZLinkDispatchErrorReason.Shutdown;
|
|
31
|
+
default:
|
|
32
|
+
return ZLinkDispatchErrorReason.HandlerException;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const ERROR_MESSAGE_MAX_LENGTH = 512;
|
|
2
37
|
|
|
3
38
|
const CREDENTIAL_PATTERNS: ReadonlyArray<readonly [RegExp, string]> = [
|
|
4
39
|
[/Authorization\s*:\s*(?:(?:Bearer|Basic)\s+)?[^\s,;]+/gi, 'Authorization: <redacted>'],
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
import { randomBytes } from 'node:crypto';
|
|
3
3
|
import type { ZLinkFlowOrigin } from '../../contracts';
|
|
4
|
+
const FLOW_UUID_BYTES = 16;
|
|
5
|
+
const FLOW_UUID_VARIANT_BYTE = 8;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Spec 27 §3 defines the flow_origin value set as lowercase
|
|
9
|
+
* (`inbound|timer|application|lifecycle`); every language emits these exact
|
|
10
|
+
* strings so records remain comparable across runtimes (spec 26 §3.1).
|
|
11
|
+
*/
|
|
12
|
+
export const FLOW_ORIGIN_VALUES: Readonly<Record<ZLinkFlowOrigin, string>> = Object.freeze({
|
|
13
|
+
Inbound: 'inbound',
|
|
14
|
+
Timer: 'timer',
|
|
15
|
+
Application: 'application',
|
|
16
|
+
Lifecycle: 'lifecycle'
|
|
17
|
+
});
|
|
4
18
|
|
|
5
19
|
export interface ZLinkFlowContextValue {
|
|
6
20
|
readonly flowId: string;
|
|
@@ -84,12 +98,12 @@ export function createInboundFlow(
|
|
|
84
98
|
}
|
|
85
99
|
|
|
86
100
|
function createFlowId(): string {
|
|
87
|
-
const bytes = randomBytes(
|
|
101
|
+
const bytes = randomBytes(FLOW_UUID_BYTES);
|
|
88
102
|
// Date.now() is always within 48 bits, which is exactly the UUIDv7
|
|
89
103
|
// timestamp field.
|
|
90
104
|
bytes.writeUIntBE(Date.now(), 0, 6);
|
|
91
105
|
bytes[6] = 0x70 | (bytes[6] & 0x0f);
|
|
92
|
-
bytes[
|
|
106
|
+
bytes[FLOW_UUID_VARIANT_BYTE] = 0x80 | (bytes[FLOW_UUID_VARIANT_BYTE] & 0x3f);
|
|
93
107
|
const hex = bytes.toString('hex');
|
|
94
108
|
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
95
109
|
}
|
|
@@ -1,37 +1,41 @@
|
|
|
1
|
+
import { AsyncResource } from 'node:async_hooks';
|
|
1
2
|
import type {
|
|
2
3
|
ZLinkLocationRuntimeQuery,
|
|
3
4
|
ZLinkLocationRuntimeStatus,
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
ZLinkLocationServiceSummary,
|
|
6
|
+
ZLinkLocationTopologyEntry
|
|
6
7
|
} from '../../contracts';
|
|
7
|
-
import type {
|
|
8
|
-
ZLinkActorLocation,
|
|
9
|
-
ZLinkPeerLocation,
|
|
10
|
-
ZLinkRouteLocation,
|
|
11
|
-
ZLinkSpotLocation
|
|
12
|
-
} from '../../contracts/Locations/Rows';
|
|
13
8
|
import type {
|
|
14
9
|
ZLinkActorLocationKey,
|
|
15
10
|
ZLinkLocationKey,
|
|
16
11
|
ZLinkRouteLocationKey,
|
|
17
12
|
ZLinkSpotLocationKey
|
|
18
13
|
} from '../../contracts/Locations/Keys';
|
|
14
|
+
import type {
|
|
15
|
+
ZLinkActorLocation,
|
|
16
|
+
ZLinkPeerLocation,
|
|
17
|
+
ZLinkRouteLocation,
|
|
18
|
+
ZLinkSpotLocation
|
|
19
|
+
} from '../../contracts/Locations/Rows';
|
|
20
|
+
import type { ZLinkBackendSocketMonitor, ZLinkBackendSocketMonitorEvent } from '../backend';
|
|
21
|
+
import { ZLinkStateLane } from '../execution/state-lane';
|
|
22
|
+
import { normalizeOpaqueRoutingId } from '../routing-id';
|
|
19
23
|
import {
|
|
20
|
-
ZLinkLocationRuntimeEventKind as LocationRuntimeEventKind,
|
|
21
24
|
ZLinkLocationActorEventKind as ActorLocationEventKind,
|
|
25
|
+
ZLinkLocationRuntimeEventKind as LocationRuntimeEventKind,
|
|
22
26
|
ZLinkLocationPeerEventKind as PeerLocationEventKind,
|
|
23
27
|
ZLinkLocationRouteEventKind as RouteLocationEventKind,
|
|
24
|
-
ZLinkLocationSpotEventKind as SpotLocationEventKind,
|
|
25
28
|
ZLinkSocketEventKind as SocketEventKind,
|
|
26
|
-
ZLinkSocketNativeEventType,
|
|
27
29
|
ZLinkSocketNativeEventType as SocketNativeEventType,
|
|
30
|
+
ZLinkLocationSpotEventKind as SpotLocationEventKind,
|
|
31
|
+
ZLinkSocketNativeEventType,
|
|
28
32
|
type ZLinkAutoConnectDesiredSetChange,
|
|
29
33
|
type ZLinkLocationActorEvent,
|
|
30
34
|
type ZLinkLocationMonitoringRegistration,
|
|
31
35
|
type ZLinkLocationPeerEvent,
|
|
36
|
+
type ZLinkLocationRouteEvent,
|
|
32
37
|
type ZLinkLocationRuntimeEvent,
|
|
33
38
|
type ZLinkLocationRuntimeEventKind,
|
|
34
|
-
type ZLinkLocationRouteEvent,
|
|
35
39
|
type ZLinkLocationSpotEvent,
|
|
36
40
|
type ZLinkPollingMonitoringRegistration,
|
|
37
41
|
type ZLinkRuntimeEvent,
|
|
@@ -40,6 +44,7 @@ import {
|
|
|
40
44
|
type ZLinkSocketEventKind,
|
|
41
45
|
type ZLinkSocketMonitoringRegistration
|
|
42
46
|
} from './internal-event-contracts';
|
|
47
|
+
|
|
43
48
|
export {
|
|
44
49
|
ZLinkLocationActorEventKind,
|
|
45
50
|
ZLinkLocationPeerEventKind,
|
|
@@ -47,10 +52,6 @@ export {
|
|
|
47
52
|
ZLinkLocationSpotEventKind,
|
|
48
53
|
ZLinkSocketNativeEventType
|
|
49
54
|
} from './internal-event-contracts';
|
|
50
|
-
import type { ZLinkBackendSocketMonitor, ZLinkBackendSocketMonitorEvent } from '../backend';
|
|
51
|
-
import { AsyncResource } from 'node:async_hooks';
|
|
52
|
-
import { ZLinkStateLane } from '../execution/state-lane';
|
|
53
|
-
import { normalizeOpaqueRoutingId } from '../routing-id';
|
|
54
55
|
|
|
55
56
|
const ZLINK_DISCONNECT_REASON_HANDSHAKE_FAILED = 3;
|
|
56
57
|
const detachedStateLaneResource = new AsyncResource('zlink:location-runtime-monitoring-source');
|
|
@@ -62,9 +63,18 @@ export interface ZLinkActorOwnerLeaseObservation {
|
|
|
62
63
|
readonly decision: 'owner_unavailable';
|
|
63
64
|
}
|
|
64
65
|
|
|
66
|
+
export function isRelocationDebugEnabled(): boolean {
|
|
67
|
+
return process.env.ZLINK_DEBUG_FRAMEWORK_RELOCATION === '1';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function relocationDebug(marker: string, detail: Record<string, unknown>): void {
|
|
71
|
+
if (!isRelocationDebugEnabled()) return;
|
|
72
|
+
console.error('[zlink.runtime.relocation]', marker, detail);
|
|
73
|
+
}
|
|
74
|
+
|
|
65
75
|
/** Emits high-cardinality resolver detail only on the existing relocation debug path. */
|
|
66
76
|
export function emitActorOwnerLeaseObservation(observation: ZLinkActorOwnerLeaseObservation): void {
|
|
67
|
-
if (
|
|
77
|
+
if (!isRelocationDebugEnabled()) return;
|
|
68
78
|
console.error('[zlink.runtime.relocation]', 'actor_route.owner_lease_observed', observation);
|
|
69
79
|
}
|
|
70
80
|
|