@zlink-systems/framework 0.21.0 → 0.22.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/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +24 -18
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +158 -124
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +116 -113
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +10 -18
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +43 -33
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -7
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +47 -39
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -23
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +136 -136
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.js +416 -438
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.js +96 -95
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +244 -227
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +208 -219
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +23 -20
- package/dist/runtime/spots/spot-actor-packet-drain.js +12 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +74 -85
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +16 -14
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +5 -5
- package/dist/runtime/spots/spot-timer.js +25 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +98 -107
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +18 -16
- package/dist/runtime/streams/bound-session-service.js +8 -9
- package/dist/runtime/streams/index.js +20 -19
- package/dist/runtime/streams/managed-stream.js +32 -30
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.js +29 -18
- package/dist/runtime/streams/session-actor-coordinator.js +34 -37
- package/dist/runtime/streams/session-context.js +30 -28
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.js +11 -5
- package/dist/runtime/streams/stream-session-runtime.js +70 -66
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +2 -2
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +0 -1
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +138 -130
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +5 -4
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +351 -320
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +73 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +335 -383
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +40 -42
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +215 -197
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +11 -8
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/flow-context.ts +12 -3
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +95 -76
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -51
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +312 -385
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +1 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1174 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +157 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +593 -563
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +184 -153
- package/src/runtime/spots/spot-actor-packet-drain.ts +54 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +230 -221
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +128 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +11 -17
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +56 -46
- package/src/runtime/spots/spot-timer.ts +98 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +277 -235
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +7 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +53 -51
- package/src/runtime/streams/bound-session-response-target.ts +29 -8
- package/src/runtime/streams/bound-session-service.ts +39 -39
- package/src/runtime/streams/index.ts +176 -100
- package/src/runtime/streams/managed-stream.ts +98 -87
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +73 -43
- package/src/runtime/streams/session-actor-coordinator.ts +97 -89
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +66 -48
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +55 -38
- package/src/runtime/streams/stream-session-runtime.ts +268 -210
- package/src/runtime/workers/index.ts +68 -29
|
@@ -13,10 +13,7 @@ import {
|
|
|
13
13
|
} from '../../contracts/Locations/Options';
|
|
14
14
|
import type { ZLinkFrameworkRegistration } from '../configuration';
|
|
15
15
|
import { buildAdvertisedEndpoint, ZLinkConfigurationException } from '../configuration';
|
|
16
|
-
import type {
|
|
17
|
-
ZLinkLocationRuntime,
|
|
18
|
-
ZLinkLocationRuntimeStores
|
|
19
|
-
} from '../locations';
|
|
16
|
+
import type { ZLinkLocationRuntime, ZLinkLocationRuntimeStores } from '../locations';
|
|
20
17
|
import type { ZLinkBackendSubscriberSocket } from '../backend/contracts';
|
|
21
18
|
import { ZLinkChannelSocketRegistry } from './channel-socket-registry';
|
|
22
19
|
import { ZLinkStateLane } from '../execution/state-lane';
|
|
@@ -34,12 +31,14 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
34
31
|
private readonly lane = new ZLinkStateLane();
|
|
35
32
|
private readonly options: Required<ZLinkLocationOptionOverrides>;
|
|
36
33
|
private readonly store: ZLinkFanoutLocationStore;
|
|
37
|
-
private readonly localDescriptors =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
private readonly localDescriptors = new Map<string, ZLinkFanoutPublisherDescriptor>();
|
|
35
|
+
private readonly publisherIdentities = new Map<
|
|
36
|
+
string,
|
|
37
|
+
{
|
|
38
|
+
readonly publisherRid: string;
|
|
39
|
+
readonly lifecycleGeneration: bigint;
|
|
40
|
+
}
|
|
41
|
+
>();
|
|
43
42
|
private readonly connections = new Map<string, ActiveFanoutTarget>();
|
|
44
43
|
private controller?: AbortController;
|
|
45
44
|
private timer?: NodeJS.Timeout;
|
|
@@ -97,25 +96,22 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
97
96
|
});
|
|
98
97
|
if (timer !== undefined) clearTimeout(timer);
|
|
99
98
|
const connectionIds = await this.lane.run(() => [...this.connections.keys()]);
|
|
100
|
-
await Promise.allSettled(
|
|
101
|
-
connectionIds.map(id => this.closeConnection(id))
|
|
102
|
-
);
|
|
99
|
+
await Promise.allSettled(connectionIds.map((id) => this.closeConnection(id)));
|
|
103
100
|
await this.removeLocalPublishers(signal);
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
activeTargets(channelName: string): readonly ZLinkFanoutPublisherDescriptor[] {
|
|
107
104
|
return [...this.connections.values()]
|
|
108
|
-
.filter(target => target.state === 'ready')
|
|
109
|
-
.map(target => target.descriptor)
|
|
110
|
-
.filter(descriptor => descriptor.channelName === channelName);
|
|
105
|
+
.filter((target) => target.state === 'ready')
|
|
106
|
+
.map((target) => target.descriptor)
|
|
107
|
+
.filter((descriptor) => descriptor.channelName === channelName);
|
|
111
108
|
}
|
|
112
109
|
|
|
113
110
|
async reclaimOwnerRows(signal?: AbortSignal): Promise<void> {
|
|
114
111
|
const owner = this.requireOwnerToken();
|
|
115
112
|
const descriptors = await this.lane.run(() => [...this.localDescriptors]);
|
|
116
113
|
for (const [channelName, current] of descriptors) {
|
|
117
|
-
if (current.ownerId === owner.ownerId
|
|
118
|
-
&& current.leaseGeneration === owner.leaseGeneration) {
|
|
114
|
+
if (current.ownerId === owner.ownerId && current.leaseGeneration === owner.leaseGeneration) {
|
|
119
115
|
continue;
|
|
120
116
|
}
|
|
121
117
|
const candidate = {
|
|
@@ -133,10 +129,12 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
133
129
|
`Fanout publisher '${channelName}' descriptor recovery was fenced.`
|
|
134
130
|
);
|
|
135
131
|
}
|
|
136
|
-
await this.lane.run(() =>
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
await this.lane.run(() =>
|
|
133
|
+
this.localDescriptors.set(channelName, {
|
|
134
|
+
...candidate,
|
|
135
|
+
updatedAt: result.updatedAt
|
|
136
|
+
})
|
|
137
|
+
);
|
|
140
138
|
}
|
|
141
139
|
}
|
|
142
140
|
|
|
@@ -166,24 +164,23 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
166
164
|
`Fanout publisher '${channelName}' descriptor renewal was fenced.`
|
|
167
165
|
);
|
|
168
166
|
}
|
|
169
|
-
await this.lane.run(() =>
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
167
|
+
await this.lane.run(() =>
|
|
168
|
+
this.localDescriptors.set(channelName, {
|
|
169
|
+
...current,
|
|
170
|
+
updatedAt: result.updatedAt
|
|
171
|
+
})
|
|
172
|
+
);
|
|
173
173
|
continue;
|
|
174
174
|
}
|
|
175
|
-
const generatedLifecycle =
|
|
176
|
-
`0x${randomUUID().replaceAll('-', '').slice(0, 16)}`
|
|
177
|
-
) & 0x7fff_ffff_ffff_ffffn;
|
|
175
|
+
const generatedLifecycle =
|
|
176
|
+
BigInt(`0x${randomUUID().replaceAll('-', '').slice(0, 16)}`) & 0x7fff_ffff_ffff_ffffn;
|
|
178
177
|
const identity = await this.lane.run(() => {
|
|
179
178
|
const currentIdentity = this.publisherIdentities.get(channelName);
|
|
180
179
|
if (currentIdentity !== undefined) return currentIdentity;
|
|
181
180
|
const created = {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
? 1n
|
|
186
|
-
: generatedLifecycle
|
|
181
|
+
publisherRid:
|
|
182
|
+
channel.routingId ?? `${channel.routingIdPrefix ?? 'fanout'}-${randomUUID()}`,
|
|
183
|
+
lifecycleGeneration: generatedLifecycle === 0n ? 1n : generatedLifecycle
|
|
187
184
|
};
|
|
188
185
|
this.publisherIdentities.set(channelName, created);
|
|
189
186
|
return created;
|
|
@@ -210,36 +207,35 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
210
207
|
`Fanout publisher '${channelName}' descriptor claim failed with '${result.status}'.`
|
|
211
208
|
);
|
|
212
209
|
}
|
|
213
|
-
await this.lane.run(() =>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
210
|
+
await this.lane.run(() =>
|
|
211
|
+
this.localDescriptors.set(channelName, {
|
|
212
|
+
...descriptor,
|
|
213
|
+
updatedAt: result.updatedAt
|
|
214
|
+
})
|
|
215
|
+
);
|
|
217
216
|
}
|
|
218
217
|
}
|
|
219
218
|
|
|
220
219
|
private async reconcileSubscribers(signal?: AbortSignal): Promise<void> {
|
|
221
220
|
for (const [channelName, channel] of this.registration.channels) {
|
|
222
|
-
if (
|
|
223
|
-
|
|
221
|
+
if (
|
|
222
|
+
channel.subscriber === undefined ||
|
|
223
|
+
(channel.subscriber.manualConnections?.length ?? 0) > 0
|
|
224
|
+
) {
|
|
224
225
|
continue;
|
|
225
226
|
}
|
|
226
227
|
const rows = await this.listLivePublishers(channelName, signal);
|
|
227
|
-
const desired = new Map(rows.map(row => [
|
|
228
|
-
fanoutConnectionId(row),
|
|
229
|
-
row
|
|
230
|
-
]));
|
|
228
|
+
const desired = new Map(rows.map((row) => [fanoutConnectionId(row), row]));
|
|
231
229
|
for (const [connectionId, descriptor] of desired) {
|
|
232
230
|
const current = await this.lane.run(() => this.connections.get(connectionId));
|
|
233
231
|
if (current === undefined) {
|
|
234
232
|
await this.openConnection(connectionId, descriptor);
|
|
235
233
|
continue;
|
|
236
234
|
}
|
|
237
|
-
if (descriptor.descriptorRevision
|
|
238
|
-
< current.descriptor.descriptorRevision) {
|
|
235
|
+
if (descriptor.descriptorRevision < current.descriptor.descriptorRevision) {
|
|
239
236
|
continue;
|
|
240
237
|
}
|
|
241
|
-
if (descriptor.descriptorRevision
|
|
242
|
-
=== current.descriptor.descriptorRevision) {
|
|
238
|
+
if (descriptor.descriptorRevision === current.descriptor.descriptorRevision) {
|
|
243
239
|
if (!sameFanoutDescriptor(descriptor, current.descriptor)) {
|
|
244
240
|
await this.closeConnection(connectionId);
|
|
245
241
|
}
|
|
@@ -258,8 +254,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
258
254
|
}
|
|
259
255
|
const connections = await this.lane.run(() => [...this.connections]);
|
|
260
256
|
for (const [connectionId, current] of connections) {
|
|
261
|
-
if (current.descriptor.channelName === channelName
|
|
262
|
-
&& !desired.has(connectionId)) {
|
|
257
|
+
if (current.descriptor.channelName === channelName && !desired.has(connectionId)) {
|
|
263
258
|
await this.closeConnection(connectionId);
|
|
264
259
|
}
|
|
265
260
|
}
|
|
@@ -285,15 +280,13 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
285
280
|
},
|
|
286
281
|
onTerminated: () => {
|
|
287
282
|
const current = this.connections.get(connectionId);
|
|
288
|
-
if (target !== undefined
|
|
289
|
-
&& current === target
|
|
290
|
-
&& current.reconnectEligible) {
|
|
283
|
+
if (target !== undefined && current === target && current.reconnectEligible) {
|
|
291
284
|
this.sockets.removeFanoutPublisher(descriptor, connectionId);
|
|
292
285
|
current.state = 'connecting';
|
|
293
286
|
setImmediate(() => {
|
|
294
|
-
void this.replaceConnection(current)
|
|
295
|
-
.
|
|
296
|
-
|
|
287
|
+
void this.replaceConnection(current).catch((error) =>
|
|
288
|
+
this.locationRuntime.reportDiscoveryFailure(error)
|
|
289
|
+
);
|
|
297
290
|
});
|
|
298
291
|
}
|
|
299
292
|
}
|
|
@@ -308,11 +301,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
308
301
|
state: 'connecting'
|
|
309
302
|
};
|
|
310
303
|
await this.lane.run(() => this.connections.set(connectionId, target));
|
|
311
|
-
target.stopReceiver = this.onSubscriberOpened(
|
|
312
|
-
descriptor.channelName,
|
|
313
|
-
connectionId,
|
|
314
|
-
subscriber
|
|
315
|
-
);
|
|
304
|
+
target.stopReceiver = this.onSubscriberOpened(descriptor.channelName, connectionId, subscriber);
|
|
316
305
|
}
|
|
317
306
|
|
|
318
307
|
private async closeConnection(connectionId: string): Promise<void> {
|
|
@@ -330,14 +319,15 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
330
319
|
await this.sockets.closeFanoutSubscriberConnection(connectionId);
|
|
331
320
|
}
|
|
332
321
|
|
|
333
|
-
private async replaceConnection(
|
|
334
|
-
expected: ActiveFanoutTarget
|
|
335
|
-
): Promise<void> {
|
|
322
|
+
private async replaceConnection(expected: ActiveFanoutTarget): Promise<void> {
|
|
336
323
|
const prepared = await this.lane.run(() => {
|
|
337
324
|
const controller = this.controller;
|
|
338
|
-
if (
|
|
339
|
-
|
|
340
|
-
||
|
|
325
|
+
if (
|
|
326
|
+
this.connections.get(expected.connectionId) !== expected ||
|
|
327
|
+
!expected.reconnectEligible ||
|
|
328
|
+
controller === undefined
|
|
329
|
+
)
|
|
330
|
+
return undefined;
|
|
341
331
|
return { controller, descriptor: expected.descriptor };
|
|
342
332
|
});
|
|
343
333
|
if (prepared === undefined) {
|
|
@@ -368,9 +358,11 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
368
358
|
for (const descriptor of rows) {
|
|
369
359
|
if (descriptor.state !== ZLinkFrameworkRuntimeState.Serving) continue;
|
|
370
360
|
const lease = await this.storeOwnerLease(descriptor.ownerId, signal);
|
|
371
|
-
if (
|
|
372
|
-
|
|
373
|
-
|
|
361
|
+
if (
|
|
362
|
+
lease.kind === 'found' &&
|
|
363
|
+
lease.token.leaseGeneration === descriptor.leaseGeneration &&
|
|
364
|
+
lease.leaseExpiresAt.getTime() > lease.storeNow.getTime()
|
|
365
|
+
) {
|
|
374
366
|
live.push(descriptor);
|
|
375
367
|
}
|
|
376
368
|
}
|
|
@@ -378,10 +370,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
378
370
|
}
|
|
379
371
|
|
|
380
372
|
private storeOwnerLease(ownerId: string, signal?: AbortSignal) {
|
|
381
|
-
return this.stores.ownerLeaseStore.readOwnerLease(
|
|
382
|
-
ownerId,
|
|
383
|
-
signal
|
|
384
|
-
);
|
|
373
|
+
return this.stores.ownerLeaseStore.readOwnerLease(ownerId, signal);
|
|
385
374
|
}
|
|
386
375
|
|
|
387
376
|
private async removeLocalPublishers(signal?: AbortSignal): Promise<void> {
|
|
@@ -389,10 +378,14 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
389
378
|
if (owner === undefined) return;
|
|
390
379
|
const descriptors = await this.lane.run(() => [...this.localDescriptors.values()]);
|
|
391
380
|
for (const descriptor of descriptors) {
|
|
392
|
-
await this.store.removeFanoutPublisher(
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
381
|
+
await this.store.removeFanoutPublisher(
|
|
382
|
+
{
|
|
383
|
+
channelName: descriptor.channelName,
|
|
384
|
+
publisherRid: descriptor.publisherRid
|
|
385
|
+
},
|
|
386
|
+
owner,
|
|
387
|
+
signal
|
|
388
|
+
);
|
|
396
389
|
}
|
|
397
390
|
await this.lane.run(() => this.localDescriptors.clear());
|
|
398
391
|
}
|
|
@@ -412,7 +405,7 @@ export class ZLinkFanoutLocationRuntime {
|
|
|
412
405
|
this.timer = setTimeout(() => {
|
|
413
406
|
this.timer = undefined;
|
|
414
407
|
void this.tickCore(this.controller?.signal)
|
|
415
|
-
.catch(error => this.locationRuntime.reportDiscoveryFailure(error))
|
|
408
|
+
.catch((error) => this.locationRuntime.reportDiscoveryFailure(error))
|
|
416
409
|
.finally(() => this.schedule());
|
|
417
410
|
}, this.options.pollingIntervalMs);
|
|
418
411
|
this.timer.unref();
|
|
@@ -429,31 +422,35 @@ function advertisedEndpoint(boundEndpoint: string, advertiseHost: string | undef
|
|
|
429
422
|
return result;
|
|
430
423
|
}
|
|
431
424
|
|
|
432
|
-
function fanoutConnectionId(
|
|
433
|
-
|
|
434
|
-
)
|
|
435
|
-
|
|
436
|
-
|
|
425
|
+
function fanoutConnectionId(descriptor: ZLinkFanoutPublisherDescriptor): string {
|
|
426
|
+
return (
|
|
427
|
+
`${descriptor.channelName}\0${String(descriptor.publisherRid)}\0` +
|
|
428
|
+
descriptor.lifecycleGeneration.toString()
|
|
429
|
+
);
|
|
437
430
|
}
|
|
438
431
|
|
|
439
432
|
function sameFanoutImmutableIdentity(
|
|
440
433
|
left: ZLinkFanoutPublisherDescriptor,
|
|
441
434
|
right: ZLinkFanoutPublisherDescriptor
|
|
442
435
|
): boolean {
|
|
443
|
-
return
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
436
|
+
return (
|
|
437
|
+
left.channelName === right.channelName &&
|
|
438
|
+
left.publisherRid === right.publisherRid &&
|
|
439
|
+
left.lifecycleGeneration === right.lifecycleGeneration &&
|
|
440
|
+
left.endpoint === right.endpoint &&
|
|
441
|
+
left.securityIdentity === right.securityIdentity &&
|
|
442
|
+
left.ownerId === right.ownerId &&
|
|
443
|
+
left.leaseGeneration === right.leaseGeneration
|
|
444
|
+
);
|
|
450
445
|
}
|
|
451
446
|
|
|
452
447
|
function sameFanoutDescriptor(
|
|
453
448
|
left: ZLinkFanoutPublisherDescriptor,
|
|
454
449
|
right: ZLinkFanoutPublisherDescriptor
|
|
455
450
|
): boolean {
|
|
456
|
-
return
|
|
457
|
-
|
|
458
|
-
|
|
451
|
+
return (
|
|
452
|
+
sameFanoutImmutableIdentity(left, right) &&
|
|
453
|
+
left.descriptorRevision === right.descriptorRevision &&
|
|
454
|
+
left.state === right.state
|
|
455
|
+
);
|
|
459
456
|
}
|
|
@@ -7,13 +7,9 @@ import { tryDecodeChannelHeader } from './channel-envelope-inspection';
|
|
|
7
7
|
import type { ZLinkChannelEnvelopeHeader } from './channel-envelope';
|
|
8
8
|
|
|
9
9
|
export { FANOUT_LIVENESS_TOPIC, requirePublicFanoutTopic };
|
|
10
|
-
export const FANOUT_LIVENESS_PAYLOAD =
|
|
11
|
-
Uint8Array.from([0x5a, 0x46, 0x01, 0x01]);
|
|
10
|
+
export const FANOUT_LIVENESS_PAYLOAD = Uint8Array.from([0x5a, 0x46, 0x01, 0x01]);
|
|
12
11
|
|
|
13
|
-
export type ZLinkFanoutInboundKind =
|
|
14
|
-
| 'application'
|
|
15
|
-
| 'beacon'
|
|
16
|
-
| 'protocolError';
|
|
12
|
+
export type ZLinkFanoutInboundKind = 'application' | 'beacon' | 'protocolError';
|
|
17
13
|
|
|
18
14
|
export interface ZLinkFanoutInboundClassification {
|
|
19
15
|
readonly kind: ZLinkFanoutInboundKind;
|
|
@@ -26,15 +22,12 @@ export function inspectFanoutInbound(
|
|
|
26
22
|
): ZLinkFanoutInboundClassification {
|
|
27
23
|
if (topic !== FANOUT_LIVENESS_TOPIC) {
|
|
28
24
|
const header = tryDecodeChannelHeader(parts as readonly Message[]);
|
|
29
|
-
return header === undefined
|
|
30
|
-
? { kind: 'protocolError' }
|
|
31
|
-
: { kind: 'application', header };
|
|
25
|
+
return header === undefined ? { kind: 'protocolError' } : { kind: 'application', header };
|
|
32
26
|
}
|
|
33
27
|
if (parts.length !== 1) return { kind: 'protocolError' };
|
|
34
28
|
const payload = parts[0]!.data();
|
|
35
|
-
return payload.length === FANOUT_LIVENESS_PAYLOAD.length
|
|
36
|
-
|
|
37
|
-
value === FANOUT_LIVENESS_PAYLOAD[index])
|
|
29
|
+
return payload.length === FANOUT_LIVENESS_PAYLOAD.length &&
|
|
30
|
+
payload.every((value, index) => value === FANOUT_LIVENESS_PAYLOAD[index])
|
|
38
31
|
? { kind: 'beacon' }
|
|
39
32
|
: { kind: 'protocolError' };
|
|
40
33
|
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
Type,
|
|
3
|
-
ZLinkHandlerFilterContext,
|
|
4
|
-
} from '../../contracts';
|
|
1
|
+
import type { Type, ZLinkHandlerFilterContext } from '../../contracts';
|
|
5
2
|
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
6
3
|
|
|
7
4
|
export interface ZLinkHandlerFilterScopeResolver {
|
|
@@ -11,10 +11,7 @@ export {
|
|
|
11
11
|
type ZLinkSpotPublisherClientTransport
|
|
12
12
|
} from './channel-transports';
|
|
13
13
|
export { DefaultZLinkChannelRuntimeOptions } from './channel-socket-options';
|
|
14
|
-
export {
|
|
15
|
-
ZLinkDispatchErrorReporter,
|
|
16
|
-
type ZLinkDispatchErrorSink
|
|
17
|
-
} from './dispatch-error-reporter';
|
|
14
|
+
export { ZLinkDispatchErrorReporter, type ZLinkDispatchErrorSink } from './dispatch-error-reporter';
|
|
18
15
|
export { ZLinkRouteDisconnectedError } from './route-disconnected-error';
|
|
19
16
|
export {
|
|
20
17
|
DefaultZLinkChannelClient,
|
|
@@ -18,7 +18,9 @@ export class ZLinkLocalSpotRouteTransport {
|
|
|
18
18
|
timeoutMs?: number
|
|
19
19
|
): Promise<void> {
|
|
20
20
|
if (this.dispatcher === undefined) {
|
|
21
|
-
throw new ZLinkConfigurationException(
|
|
21
|
+
throw new ZLinkConfigurationException(
|
|
22
|
+
`Route channel '${routerChannelId}' could not dispatch local SPOT send.`
|
|
23
|
+
);
|
|
22
24
|
}
|
|
23
25
|
await this.dispatcher.send(spotId, packetName, message, {
|
|
24
26
|
channelName: routerChannelId,
|
|
@@ -37,7 +39,9 @@ export class ZLinkLocalSpotRouteTransport {
|
|
|
37
39
|
signal?: AbortSignal
|
|
38
40
|
): Promise<TReply> {
|
|
39
41
|
if (this.dispatcher === undefined) {
|
|
40
|
-
throw new ZLinkConfigurationException(
|
|
42
|
+
throw new ZLinkConfigurationException(
|
|
43
|
+
`Route channel '${routerChannelId}' could not dispatch local SPOT request.`
|
|
44
|
+
);
|
|
41
45
|
}
|
|
42
46
|
const pending = this.dispatcher.request<TReply>(spotId, packetName, request, {
|
|
43
47
|
channelName: routerChannelId,
|
|
@@ -47,12 +51,23 @@ export class ZLinkLocalSpotRouteTransport {
|
|
|
47
51
|
if (effectiveTimeoutMs === undefined) return pending;
|
|
48
52
|
return new Promise<TReply>((resolve, reject) => {
|
|
49
53
|
const timeout = setTimeout(
|
|
50
|
-
() =>
|
|
54
|
+
() =>
|
|
55
|
+
reject(
|
|
56
|
+
new ZLinkConfigurationException(
|
|
57
|
+
`Route channel '${routerChannelId}' local SPOT request timed out.`
|
|
58
|
+
)
|
|
59
|
+
),
|
|
51
60
|
effectiveTimeoutMs
|
|
52
61
|
);
|
|
53
62
|
pending.then(
|
|
54
|
-
(value) => {
|
|
55
|
-
|
|
63
|
+
(value) => {
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
resolve(value);
|
|
66
|
+
},
|
|
67
|
+
(error) => {
|
|
68
|
+
clearTimeout(timeout);
|
|
69
|
+
reject(error);
|
|
70
|
+
}
|
|
56
71
|
);
|
|
57
72
|
});
|
|
58
73
|
}
|
|
@@ -14,14 +14,20 @@ export class ZLinkRouteMemberSnapshot {
|
|
|
14
14
|
observeReady(channel: string, routingId: string, endpoint: string): void {
|
|
15
15
|
getOrCreateSet(this.members, channel).add(routingId);
|
|
16
16
|
getOrCreateSet(this.connected, channel).add(routingId);
|
|
17
|
-
if (endpoint.length > 0)
|
|
17
|
+
if (endpoint.length > 0)
|
|
18
|
+
getOrCreateMap(this.memberByEndpoint, channel).set(endpoint, routingId);
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
observeTermination(
|
|
21
|
+
observeTermination(
|
|
22
|
+
channel: string,
|
|
23
|
+
routingId: string | undefined,
|
|
24
|
+
endpoint: string
|
|
25
|
+
): string | undefined {
|
|
21
26
|
const connected = this.connected.get(channel);
|
|
22
|
-
const disconnected =
|
|
23
|
-
??
|
|
24
|
-
|
|
27
|
+
const disconnected =
|
|
28
|
+
routingId ??
|
|
29
|
+
this.memberByEndpoint.get(channel)?.get(endpoint) ??
|
|
30
|
+
(connected?.size === 1 ? connected.values().next().value : undefined);
|
|
25
31
|
if (disconnected === undefined) return undefined;
|
|
26
32
|
getOrCreateSet(this.members, channel).add(disconnected);
|
|
27
33
|
connected?.delete(disconnected);
|
|
@@ -39,12 +39,7 @@ export class ZLinkRouterSocketSpotRouteTransport {
|
|
|
39
39
|
): Promise<TReply> {
|
|
40
40
|
const router = this.sockets.routeRouter(target.routerChannelId);
|
|
41
41
|
void flags;
|
|
42
|
-
const operation = router.requestToSpot(
|
|
43
|
-
target.targetNodeRid,
|
|
44
|
-
target.spotId,
|
|
45
|
-
parts,
|
|
46
|
-
timeoutMs
|
|
47
|
-
);
|
|
42
|
+
const operation = router.requestToSpot(target.targetNodeRid, target.spotId, parts, timeoutMs);
|
|
48
43
|
const replyParts = await awaitWithAbort(operation, signal, () => {
|
|
49
44
|
void operation.then(closeMessages, () => undefined);
|
|
50
45
|
});
|
|
@@ -73,5 +68,4 @@ export class ZLinkRouterSocketSpotRouteTransport {
|
|
|
73
68
|
void operation.then(closeMessages, () => undefined);
|
|
74
69
|
});
|
|
75
70
|
}
|
|
76
|
-
|
|
77
71
|
}
|
|
@@ -17,18 +17,20 @@ export class ZLinkSourceSpotRouter {
|
|
|
17
17
|
signal?: AbortSignal
|
|
18
18
|
): Promise<TReply> {
|
|
19
19
|
throwIfAborted(signal);
|
|
20
|
-
const parts = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
const parts = [
|
|
21
|
+
encodeSpotDirectEnvelope(
|
|
22
|
+
ZLinkChannelMessageKind.Request,
|
|
23
|
+
target.routerChannelId,
|
|
24
|
+
packetName,
|
|
25
|
+
request
|
|
26
|
+
)
|
|
27
|
+
] as readonly Message[];
|
|
26
28
|
const operation = sourceSpot.requestToSpot(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
target.targetNodeRid,
|
|
30
|
+
target.spotId,
|
|
31
|
+
parts,
|
|
32
|
+
timeoutMs ?? this.defaultRequestTimeoutMs
|
|
33
|
+
);
|
|
32
34
|
const replyParts = await awaitWithAbort(operation, signal, () => {
|
|
33
35
|
void operation.then(closeMessages, () => undefined);
|
|
34
36
|
});
|
|
@@ -50,13 +52,15 @@ export class ZLinkSourceSpotRouter {
|
|
|
50
52
|
timeoutMs?: number
|
|
51
53
|
): Promise<void> {
|
|
52
54
|
throwIfAborted(signal);
|
|
53
|
-
const parts = [
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
const parts = [
|
|
56
|
+
encodeSpotDirectEnvelope(
|
|
57
|
+
ZLinkChannelMessageKind.Command,
|
|
58
|
+
target.routerChannelId,
|
|
59
|
+
packetName,
|
|
60
|
+
message,
|
|
61
|
+
metadata
|
|
62
|
+
)
|
|
63
|
+
] as readonly Message[];
|
|
60
64
|
try {
|
|
61
65
|
void timeoutMs;
|
|
62
66
|
await awaitWithAbort(
|
|
@@ -77,10 +81,10 @@ export class ZLinkSourceSpotRouter {
|
|
|
77
81
|
): Promise<readonly Message[]> {
|
|
78
82
|
throwIfAborted(signal);
|
|
79
83
|
const operation = sourceSpot.requestToSpot(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
+
target.targetNodeRid,
|
|
85
|
+
target.spotId,
|
|
86
|
+
request,
|
|
87
|
+
timeoutMs ?? this.defaultRequestTimeoutMs
|
|
84
88
|
);
|
|
85
89
|
return await awaitWithAbort(operation, signal, () => {
|
|
86
90
|
void operation.then(closeMessages, () => undefined);
|
|
@@ -12,14 +12,16 @@ export function encodeSpotDirectEnvelope(
|
|
|
12
12
|
payload: unknown,
|
|
13
13
|
metadata?: ReadonlyMap<string, string>
|
|
14
14
|
): MessageLike {
|
|
15
|
-
return Buffer.from(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
return Buffer.from(
|
|
16
|
+
JSON.stringify({
|
|
17
|
+
marker: SPOT_DIRECT_ENVELOPE,
|
|
18
|
+
kind,
|
|
19
|
+
channelName,
|
|
20
|
+
packetName,
|
|
21
|
+
payload,
|
|
22
|
+
metadata: Object.fromEntries(metadata ?? [])
|
|
23
|
+
})
|
|
24
|
+
);
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
export function decodeSpotDirectReply<TReply>(parts: readonly Message[]): TReply {
|
|
@@ -26,10 +26,7 @@ export class ZLinkSpotNodeRouteTransport {
|
|
|
26
26
|
}
|
|
27
27
|
try {
|
|
28
28
|
throwIfAborted(signal);
|
|
29
|
-
await awaitWithAbort(
|
|
30
|
-
router.sendToSpot(target.targetNodeRid, target.spotId, parts),
|
|
31
|
-
signal
|
|
32
|
-
);
|
|
29
|
+
await awaitWithAbort(router.sendToSpot(target.targetNodeRid, target.spotId, parts), signal);
|
|
33
30
|
return true;
|
|
34
31
|
} finally {
|
|
35
32
|
closeMessages(parts);
|
|
@@ -50,21 +47,21 @@ export class ZLinkSpotNodeRouteTransport {
|
|
|
50
47
|
const effectiveTimeoutMs = timeoutMs ?? this.registration.requestTimeoutMs ?? 30_000;
|
|
51
48
|
throwIfAborted(signal);
|
|
52
49
|
const operation = router.requestToSpot(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
target.targetNodeRid,
|
|
51
|
+
target.spotId,
|
|
52
|
+
parts,
|
|
53
|
+
effectiveTimeoutMs
|
|
54
|
+
);
|
|
58
55
|
return awaitWithAbort(operation, signal, () => {
|
|
59
56
|
void operation.then(closeMessages, () => undefined);
|
|
60
57
|
}).then((replyParts) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
58
|
+
try {
|
|
59
|
+
return decodeChannelReply<TReply>(replyParts, codecs);
|
|
60
|
+
} finally {
|
|
61
|
+
closeMessages(replyParts);
|
|
62
|
+
closeMessages(parts);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
68
65
|
}
|
|
69
66
|
|
|
70
67
|
requestRaw(
|