@zlink-systems/framework 0.25.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/Channels/IZLinkFanoutClient.d.ts +0 -6
- 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/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -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 +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- 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 +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- 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 +85 -123
- 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 +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- 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-contracts.d.ts +4 -2
- 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/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- 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 +7 -1
- package/dist/runtime/admission.js +11 -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 +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- 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-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -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 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- 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 -18
- 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.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- 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 +133 -81
- 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 +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- 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/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- 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 +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- 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.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -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 +23 -8
- 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-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- 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 -19
- 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 +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- 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 +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- 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 +19 -14
- package/dist/runtime/host/index.js +234 -175
- 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 +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- 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 +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- 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 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- 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 +79 -27
- 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 +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- 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 +44 -30
- 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 +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- 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 +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- 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 +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- 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 +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- 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 +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- 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 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- 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 +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- 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 +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- 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/session-serial-executor.js +2 -2
- 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/Channels/IZLinkFanoutClient.ts +0 -7
- 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/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- 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 +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- 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 +15 -36
- 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-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- 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 +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- 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 -31
- 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 +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- 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 +175 -106
- 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 +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- 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/listener-records.ts +21 -0
- 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 +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -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 +30 -19
- 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-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- 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 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- 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 +266 -418
- 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 +408 -312
- 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 +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- 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 +1161 -904
- 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 +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- 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 +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- 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 +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- 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 +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- 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 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- 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 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- 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/session-serial-executor.ts +2 -2
- 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/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- 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/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkChannelSocketRegistry = void 0;
|
|
4
|
+
const disposal_1 = require("../disposal");
|
|
5
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
4
7
|
const contracts_1 = require("../../contracts");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const abort_1 = require("../abort");
|
|
8
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
9
|
+
const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
|
|
8
10
|
const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
|
|
9
|
-
const
|
|
10
|
-
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
11
|
-
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
const abort_1 = require("../abort");
|
|
12
12
|
const runtime_message_1 = require("../backend/runtime-message");
|
|
13
|
-
const
|
|
13
|
+
const runtime_values_1 = require("../backend/runtime-values");
|
|
14
|
+
const configuration_1 = require("../configuration");
|
|
15
|
+
const internal_event_contracts_1 = require("../diagnostics/internal-event-contracts");
|
|
16
|
+
const listener_records_1 = require("../foundation/listener-records");
|
|
14
17
|
const runtime_state_projections_1 = require("../foundation/runtime-state-projections");
|
|
18
|
+
const service_discovery_registry_1 = require("../foundation/service-discovery-registry");
|
|
19
|
+
const service_liveness_registry_1 = require("../foundation/service-liveness-registry");
|
|
15
20
|
const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
|
|
21
|
+
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
16
22
|
const client_server_service_wire_1 = require("./client-server-service-wire");
|
|
17
23
|
const fanout_service_wire_1 = require("./fanout-service-wire");
|
|
18
|
-
const
|
|
24
|
+
const route_member_snapshot_1 = require("./route-member-snapshot");
|
|
19
25
|
const MAX_LIFECYCLE_GENERATION = 0x7fffffffffffffffn;
|
|
20
|
-
const CLIENT_SERVER_PROBE_INTERVAL_MS =
|
|
21
|
-
const CLIENT_SERVER_PEER_DEADLINE_MS =
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
26
|
+
const CLIENT_SERVER_PROBE_INTERVAL_MS = service_liveness_registry_1.DEFAULT_SERVICE_PROBE_INTERVAL_MS;
|
|
27
|
+
const CLIENT_SERVER_PEER_DEADLINE_MS = service_liveness_registry_1.DEFAULT_SERVICE_PEER_TIMEOUT_MS;
|
|
28
|
+
const CLIENT_SERVER_LIVENESS_TICK_MS = 100;
|
|
29
|
+
const DEFAULT_SEND_TIMEOUT_MS = 1_000;
|
|
25
30
|
class ZLinkChannelSocketRegistry {
|
|
26
31
|
registration;
|
|
27
32
|
adapter;
|
|
@@ -43,7 +48,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
43
48
|
routeMeshPublicWeights = new Map();
|
|
44
49
|
clientServerAdmittedClients = new Map();
|
|
45
50
|
clientServerServerPeers = new Map();
|
|
46
|
-
|
|
51
|
+
disposal = new disposal_1.RuntimeDisposal();
|
|
52
|
+
ownedResources = new Set();
|
|
47
53
|
fanoutConnections = new Map();
|
|
48
54
|
fanoutPublisherNextBeacon = new Map();
|
|
49
55
|
clientServerLivenessTimer;
|
|
@@ -51,17 +57,23 @@ class ZLinkChannelSocketRegistry {
|
|
|
51
57
|
clientServerMonitorHandlers = new Map();
|
|
52
58
|
fanoutMonitorHandlers = new Map();
|
|
53
59
|
fanoutTopologyHandlers = new Map();
|
|
54
|
-
|
|
60
|
+
listenerRecords;
|
|
61
|
+
constructor(registration, adapter, context, monitoringAdapter, oneWayFailureSink, applicationJobQueue, listenerRecords) {
|
|
55
62
|
this.registration = registration;
|
|
56
63
|
this.adapter = adapter;
|
|
57
64
|
this.context = context;
|
|
58
65
|
this.monitoringAdapter = monitoringAdapter;
|
|
59
66
|
this.oneWayFailureSink = oneWayFailureSink;
|
|
60
67
|
this.applicationJobQueue = applicationJobQueue;
|
|
68
|
+
this.listenerRecords = listenerRecords ?? new listener_records_1.ZLinkListenerRecords();
|
|
61
69
|
}
|
|
62
|
-
|
|
70
|
+
dispose() {
|
|
71
|
+
return this.disposal.run(() => this.disposeCore());
|
|
72
|
+
}
|
|
73
|
+
async disposeCore() {
|
|
74
|
+
this.clientServerDiscovery.dispose((0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RuntimeShutdown, 'Channel sockets are shutting down.'));
|
|
63
75
|
const clientServerConnections = [...new Set(this.clientServerConnections.values())];
|
|
64
|
-
const clientServerPollers = clientServerConnections.
|
|
76
|
+
const clientServerPollers = clientServerConnections.flatMap((connection) => connection.readablePoller === undefined ? [] : [connection.readablePoller]);
|
|
65
77
|
const sockets = [
|
|
66
78
|
...this.clientDealers.values(),
|
|
67
79
|
...clientServerConnections.map((value) => value.dealer),
|
|
@@ -77,8 +89,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
77
89
|
...this.routeRouters.values()
|
|
78
90
|
]))
|
|
79
91
|
this.unregisterReceiveFlowSocket(socket);
|
|
80
|
-
this.clientDealers.clear();
|
|
81
|
-
this.clientServerConnections.clear();
|
|
82
92
|
this.clientServerReadyIdentities.clear();
|
|
83
93
|
this.clientServerServerDescriptors.clear();
|
|
84
94
|
this.clientServerPublicWeights.clear();
|
|
@@ -88,23 +98,40 @@ class ZLinkChannelSocketRegistry {
|
|
|
88
98
|
this.clientServerMonitorHandlers.clear();
|
|
89
99
|
this.fanoutMonitorHandlers.clear();
|
|
90
100
|
this.fanoutTopologyHandlers.clear();
|
|
91
|
-
this.fanoutConnections.clear();
|
|
92
101
|
this.fanoutPublisherNextBeacon.clear();
|
|
93
102
|
if (this.clientServerLivenessTimer !== undefined) {
|
|
94
103
|
clearInterval(this.clientServerLivenessTimer);
|
|
95
104
|
this.clientServerLivenessTimer = undefined;
|
|
96
105
|
}
|
|
97
|
-
this.channelRouters.clear();
|
|
98
|
-
this.publishers.clear();
|
|
99
|
-
this.routeRouters.clear();
|
|
100
106
|
this.routeMembers.clear();
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
const cleanup = await Promise.allSettled([...new Set([...clientServerPollers, ...this.ownedResources, ...sockets])].map(async (resource) => {
|
|
108
|
+
await resource.dispose();
|
|
109
|
+
this.ownedResources.delete(resource);
|
|
110
|
+
for (const owners of [
|
|
111
|
+
this.clientDealers,
|
|
112
|
+
this.channelRouters,
|
|
113
|
+
this.publishers,
|
|
114
|
+
this.routeRouters
|
|
115
|
+
]) {
|
|
116
|
+
for (const [name, owned] of owners)
|
|
117
|
+
if (owned === resource)
|
|
118
|
+
owners.delete(name);
|
|
119
|
+
}
|
|
120
|
+
for (const [name, owned] of this.clientServerConnections) {
|
|
121
|
+
if (owned.dealer === resource)
|
|
122
|
+
this.clientServerConnections.delete(name);
|
|
123
|
+
if (owned.readablePoller === resource)
|
|
124
|
+
owned.readablePoller = undefined;
|
|
125
|
+
if (owned.monitor === resource)
|
|
126
|
+
owned.monitor = undefined;
|
|
127
|
+
}
|
|
128
|
+
for (const [name, owned] of this.fanoutConnections) {
|
|
129
|
+
if (owned.subscriber === resource)
|
|
130
|
+
this.fanoutConnections.delete(name);
|
|
131
|
+
if (owned.monitor === resource)
|
|
132
|
+
owned.monitor = undefined;
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
108
135
|
const errors = cleanup
|
|
109
136
|
.filter((result) => result.status === 'rejected')
|
|
110
137
|
.map((result) => result.reason);
|
|
@@ -124,13 +151,16 @@ class ZLinkChannelSocketRegistry {
|
|
|
124
151
|
throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
|
|
125
152
|
}
|
|
126
153
|
const dealer = this.adapter.createDealerSocket(this.context);
|
|
154
|
+
this.clientDealers.set(channelName, dealer);
|
|
127
155
|
this.registerReceiveFlowSocket(dealer);
|
|
128
156
|
dealer.setChannelName(channelName);
|
|
129
157
|
if (channel?.routingId !== undefined && channel.routingId.length > 0) {
|
|
130
158
|
dealer.setRoutingId(deriveRoutingId(channel.routingId, 'dealer'));
|
|
131
159
|
}
|
|
132
|
-
applySocketConfig(dealer,
|
|
133
|
-
|
|
160
|
+
applySocketConfig(dealer, {
|
|
161
|
+
...client,
|
|
162
|
+
sendTimeoutMs: configuredSendTimeoutMs(client.sendTimeoutMs)
|
|
163
|
+
});
|
|
134
164
|
return dealer;
|
|
135
165
|
}
|
|
136
166
|
channelRouter(channelName) {
|
|
@@ -146,6 +176,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
146
176
|
throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
|
|
147
177
|
}
|
|
148
178
|
const router = this.adapter.createRouterSocket(this.context);
|
|
179
|
+
this.channelRouters.set(channelName, router);
|
|
149
180
|
this.registerReceiveFlowSocket(router);
|
|
150
181
|
router.setChannelName(channelName);
|
|
151
182
|
const identity = this.clientServerIdentities.get(channelName) ?? {
|
|
@@ -154,14 +185,14 @@ class ZLinkChannelSocketRegistry {
|
|
|
154
185
|
};
|
|
155
186
|
this.clientServerIdentities.set(channelName, identity);
|
|
156
187
|
router.setRoutingId(identity.serverRid);
|
|
157
|
-
const publicWeight = channel.server.weight ??
|
|
188
|
+
const publicWeight = channel.server.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
158
189
|
this.clientServerPublicWeights.set(channelName, publicWeight);
|
|
159
190
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
160
191
|
applySocketConfig(router, channel.server);
|
|
161
192
|
router.bind(channel.server.bind);
|
|
162
193
|
if (this.monitoringAdapter !== undefined) {
|
|
163
194
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
164
|
-
this.
|
|
195
|
+
this.ownedResources.add(monitor);
|
|
165
196
|
monitor.onEvent((event) => {
|
|
166
197
|
if (event.routingId === undefined)
|
|
167
198
|
return;
|
|
@@ -176,15 +207,15 @@ class ZLinkChannelSocketRegistry {
|
|
|
176
207
|
this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
|
|
177
208
|
});
|
|
178
209
|
}
|
|
179
|
-
|
|
210
|
+
const endpoint = advertisedEndpoint(router.lastEndpoint ?? channel.server.bind, channel.server.advertiseHost);
|
|
211
|
+
this.recordListener('clientServer', channelName, endpoint);
|
|
180
212
|
if (!this.clientServerServerDescriptors.has(channelName)) {
|
|
181
|
-
const boundEndpoint = router.lastEndpoint ?? channel.server.bind;
|
|
182
213
|
this.clientServerServerDescriptors.set(channelName, {
|
|
183
214
|
channelName,
|
|
184
215
|
serverRid: identity.serverRid,
|
|
185
216
|
lifecycleGeneration: identity.lifecycleGeneration,
|
|
186
217
|
descriptorRevision: 1n,
|
|
187
|
-
endpoint
|
|
218
|
+
endpoint,
|
|
188
219
|
weight: publicWeight,
|
|
189
220
|
state: contracts_1.ZLinkFrameworkRuntimeState.Serving,
|
|
190
221
|
securityIdentity: 'default',
|
|
@@ -196,27 +227,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
196
227
|
return router;
|
|
197
228
|
}
|
|
198
229
|
clientServerServerIdentity(channelName) {
|
|
199
|
-
|
|
230
|
+
this.channelRouter(channelName);
|
|
200
231
|
const identity = this.clientServerIdentities.get(channelName);
|
|
201
|
-
const
|
|
202
|
-
if (identity === undefined ||
|
|
232
|
+
const endpoint = this.listenerRecords.endpoint('clientServer', channelName);
|
|
233
|
+
if (identity === undefined || endpoint === undefined) {
|
|
203
234
|
throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' is not registered.`);
|
|
204
235
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
};
|
|
236
|
+
return { ...identity, endpoint };
|
|
237
|
+
}
|
|
238
|
+
fanoutPublisherEndpoint(channelName) {
|
|
239
|
+
return this.listenerRecords.endpoint('fanout', channelName);
|
|
240
|
+
}
|
|
241
|
+
recordListener(kind, name, endpoint) {
|
|
242
|
+
this.listenerRecords.record(kind, name, endpoint);
|
|
213
243
|
}
|
|
214
244
|
clientServerServerSocket(channelName) {
|
|
215
245
|
return this.channelRouter(channelName);
|
|
216
246
|
}
|
|
217
247
|
clientServerServerWeight(channelName) {
|
|
218
248
|
this.channelRouter(channelName);
|
|
219
|
-
return this.clientServerPublicWeights.get(channelName) ??
|
|
249
|
+
return this.clientServerPublicWeights.get(channelName) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
220
250
|
}
|
|
221
251
|
setClientServerServerWeight(channelName, weight) {
|
|
222
252
|
requirePublicWeight(weight);
|
|
@@ -237,50 +267,33 @@ class ZLinkChannelSocketRegistry {
|
|
|
237
267
|
throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
|
|
238
268
|
}
|
|
239
269
|
const dealer = this.adapter.createDealerSocket(this.context);
|
|
240
|
-
this.registerReceiveFlowSocket(dealer);
|
|
241
|
-
dealer.setChannelName(channelName);
|
|
242
|
-
dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
|
|
243
|
-
applySocketConfig(dealer, client);
|
|
244
|
-
const cleanupDealer = () => {
|
|
245
|
-
this.unregisterReceiveFlowSocket(dealer);
|
|
246
|
-
void Promise.allSettled([dealer.dispose()]);
|
|
247
|
-
};
|
|
248
|
-
let readablePoller;
|
|
249
|
-
try {
|
|
250
|
-
readablePoller = this.adapter.createReadablePoller(dealer);
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
cleanupDealer();
|
|
254
|
-
throw error;
|
|
255
|
-
}
|
|
256
|
-
let monitor;
|
|
257
|
-
try {
|
|
258
|
-
monitor = this.monitoringAdapter.openSocketMonitor(dealer);
|
|
259
|
-
}
|
|
260
|
-
catch (error) {
|
|
261
|
-
try {
|
|
262
|
-
readablePoller.dispose();
|
|
263
|
-
}
|
|
264
|
-
finally {
|
|
265
|
-
cleanupDealer();
|
|
266
|
-
}
|
|
267
|
-
throw error;
|
|
268
|
-
}
|
|
269
|
-
this.ownedMonitors.add(monitor);
|
|
270
270
|
const connection = {
|
|
271
271
|
channelName,
|
|
272
272
|
endpoint,
|
|
273
273
|
dealer,
|
|
274
|
-
readablePoller,
|
|
275
|
-
monitor,
|
|
276
274
|
aliases: new Set([connectionId]),
|
|
277
275
|
callbacksByAlias: new Map([[connectionId, callbacks]]),
|
|
278
|
-
physicalConnectionId: Symbol(connectionId)
|
|
279
|
-
terminationRequested: false
|
|
276
|
+
physicalConnectionId: Symbol(connectionId)
|
|
280
277
|
};
|
|
281
|
-
this.
|
|
282
|
-
|
|
278
|
+
this.ownedResources.add(dealer);
|
|
279
|
+
const created = [dealer];
|
|
283
280
|
try {
|
|
281
|
+
this.clientServerConnections.set(connectionId, connection);
|
|
282
|
+
this.registerReceiveFlowSocket(dealer);
|
|
283
|
+
dealer.setChannelName(channelName);
|
|
284
|
+
dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
|
|
285
|
+
applySocketConfig(dealer, {
|
|
286
|
+
...client,
|
|
287
|
+
sendTimeoutMs: configuredSendTimeoutMs(client.sendTimeoutMs)
|
|
288
|
+
});
|
|
289
|
+
connection.readablePoller = this.adapter.createReadablePoller(dealer);
|
|
290
|
+
created.push(connection.readablePoller);
|
|
291
|
+
this.ownedResources.add(connection.readablePoller);
|
|
292
|
+
const monitor = this.monitoringAdapter.openSocketMonitor(dealer);
|
|
293
|
+
connection.monitor = monitor;
|
|
294
|
+
created.push(monitor);
|
|
295
|
+
this.ownedResources.add(monitor);
|
|
296
|
+
this.ensureClientServerLivenessTimer();
|
|
284
297
|
monitor.onEvent((event) => {
|
|
285
298
|
if (![...connection.aliases].some((alias) => this.clientServerConnections.get(alias) === connection))
|
|
286
299
|
return;
|
|
@@ -290,7 +303,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
290
303
|
const routingId = event.routingId === undefined ? undefined : String(event.routingId);
|
|
291
304
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady) {
|
|
292
305
|
// This single-endpoint DEALER also receives its disconnected ready-count snapshot.
|
|
293
|
-
if (event.value === 0n
|
|
306
|
+
if (event.value === 0n)
|
|
294
307
|
return;
|
|
295
308
|
connection.physicalConnectionId = Symbol(connectionId);
|
|
296
309
|
connection.admissionAttempt = undefined;
|
|
@@ -304,47 +317,32 @@ class ZLinkChannelSocketRegistry {
|
|
|
304
317
|
event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedNoDetail ||
|
|
305
318
|
event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedProtocol ||
|
|
306
319
|
event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.HandshakeFailedAuth) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
event.nativeEvent !== internal_event_contracts_1.ZLinkSocketNativeEventType.Closed)))
|
|
311
|
-
return;
|
|
312
|
-
connection.physicalConnectionId = Symbol(connectionId);
|
|
313
|
-
connection.admissionAttempt = undefined;
|
|
314
|
-
if (connection.readyConnectionId !== undefined) {
|
|
315
|
-
this.removeReadyConnection(connection.readyConnectionId);
|
|
316
|
-
}
|
|
317
|
-
for (const currentCallbacks of [...connection.callbacksByAlias.values()]) {
|
|
318
|
-
currentCallbacks.onTerminated(routingId, event.remoteAddr);
|
|
319
|
-
}
|
|
320
|
-
if (connection.terminationRequested) {
|
|
321
|
-
connection.terminationRequested = false;
|
|
322
|
-
// Explicit disconnect removes intent; restore it once after this endpoint closes.
|
|
323
|
-
connection.dealer.connect(connection.endpoint);
|
|
324
|
-
}
|
|
320
|
+
// Core owns the endpoint reconnect (transport liveness §6); the
|
|
321
|
+
// connect intent stays and the next READY starts a new admission.
|
|
322
|
+
this.endClientServerAdmission(connectionId, connection, routingId, event.remoteAddr);
|
|
325
323
|
}
|
|
326
324
|
});
|
|
327
325
|
dealer.connect(endpoint);
|
|
326
|
+
return dealer;
|
|
328
327
|
}
|
|
329
328
|
catch (error) {
|
|
330
329
|
this.clientServerConnections.delete(connectionId);
|
|
331
|
-
this.
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
330
|
+
this.unregisterReceiveFlowSocket(dealer);
|
|
331
|
+
void Promise.allSettled(created.map(async (resource) => {
|
|
332
|
+
await resource.dispose();
|
|
333
|
+
this.ownedResources.delete(resource);
|
|
334
|
+
})).then((results) => {
|
|
335
|
+
for (const result of results)
|
|
336
|
+
if (result.status === 'rejected')
|
|
337
|
+
this.oneWayFailureSink?.(result.reason);
|
|
338
|
+
});
|
|
339
339
|
throw error;
|
|
340
340
|
}
|
|
341
|
-
return dealer;
|
|
342
341
|
}
|
|
343
342
|
async closeClientServerConnection(connectionId) {
|
|
344
343
|
const current = this.clientServerConnections.get(connectionId);
|
|
345
344
|
if (current === undefined)
|
|
346
345
|
return;
|
|
347
|
-
this.clientServerConnections.delete(connectionId);
|
|
348
346
|
current.aliases.delete(connectionId);
|
|
349
347
|
current.callbacksByAlias.delete(connectionId);
|
|
350
348
|
const ready = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -364,21 +362,34 @@ class ZLinkChannelSocketRegistry {
|
|
|
364
362
|
});
|
|
365
363
|
}
|
|
366
364
|
}
|
|
367
|
-
|
|
365
|
+
this.notifyClientServerTopology(current.channelName);
|
|
366
|
+
if (current.aliases.size > 0) {
|
|
367
|
+
this.clientServerConnections.delete(connectionId);
|
|
368
368
|
return;
|
|
369
|
+
}
|
|
369
370
|
await this.disposeClientServerPhysical(connectionId, current);
|
|
371
|
+
this.clientServerConnections.delete(connectionId);
|
|
370
372
|
}
|
|
371
373
|
async disposeClientServerPhysical(connectionId, current) {
|
|
372
374
|
try {
|
|
373
375
|
current.dealer.disconnect(current.endpoint);
|
|
374
376
|
}
|
|
375
377
|
catch {
|
|
376
|
-
//
|
|
378
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
377
379
|
}
|
|
378
|
-
this.ownedMonitors.delete(current.monitor);
|
|
379
380
|
this.unregisterReceiveFlowSocket(current.dealer);
|
|
380
|
-
current.readablePoller
|
|
381
|
-
|
|
381
|
+
if (current.readablePoller !== undefined) {
|
|
382
|
+
current.readablePoller.dispose();
|
|
383
|
+
this.ownedResources.delete(current.readablePoller);
|
|
384
|
+
current.readablePoller = undefined;
|
|
385
|
+
}
|
|
386
|
+
const results = await Promise.allSettled([
|
|
387
|
+
current.monitor?.dispose(),
|
|
388
|
+
(async () => {
|
|
389
|
+
await current.dealer.dispose();
|
|
390
|
+
this.ownedResources.delete(current.dealer);
|
|
391
|
+
})()
|
|
392
|
+
]);
|
|
382
393
|
const errors = results
|
|
383
394
|
.filter((result) => result.status === 'rejected')
|
|
384
395
|
.map((result) => result.reason);
|
|
@@ -387,6 +398,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
387
398
|
if (errors.length > 1) {
|
|
388
399
|
throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
|
|
389
400
|
}
|
|
401
|
+
if (current.monitor !== undefined)
|
|
402
|
+
this.ownedResources.delete(current.monitor);
|
|
390
403
|
}
|
|
391
404
|
admitClientServerConnection(descriptor, connectionId) {
|
|
392
405
|
const connection = this.clientServerConnections.get(connectionId);
|
|
@@ -396,6 +409,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
396
409
|
const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connection.readyConnectionId);
|
|
397
410
|
if (admitted)
|
|
398
411
|
connection.admittedDescriptor = descriptor;
|
|
412
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
399
413
|
return admitted;
|
|
400
414
|
}
|
|
401
415
|
const duplicateId = [...this.clientServerReadyIdentities].find(([, identity]) => identity.channelName === descriptor.channelName &&
|
|
@@ -429,6 +443,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
429
443
|
connection.readyConnectionId = connectionId;
|
|
430
444
|
connection.admittedDescriptor = descriptor;
|
|
431
445
|
}
|
|
446
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
432
447
|
return admitted;
|
|
433
448
|
}
|
|
434
449
|
removeClientServerReady(channelName, serverRoutingId, connectionId) {
|
|
@@ -443,6 +458,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
443
458
|
connection.outstandingProbeId = undefined;
|
|
444
459
|
}
|
|
445
460
|
}
|
|
461
|
+
this.notifyClientServerTopology(channelName);
|
|
446
462
|
return removed;
|
|
447
463
|
}
|
|
448
464
|
selectClientServerDealer(channelName) {
|
|
@@ -466,47 +482,58 @@ class ZLinkChannelSocketRegistry {
|
|
|
466
482
|
}
|
|
467
483
|
return undefined;
|
|
468
484
|
}
|
|
469
|
-
/**
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
* the call's remaining deadline and five seconds, mirroring the .NET reference
|
|
474
|
-
* `ZLinkClientServerClientRuntime.WaitForReadyAsync`. The wait lives here because this registry
|
|
475
|
-
* owns ClientServer connections, admission and weighted selection. Sends have no per-call
|
|
476
|
-
* timeout, so they use the Channel's request timeout.
|
|
477
|
-
*
|
|
478
|
-
* The wait only observes admission that is already in flight: it never opens or reconnects a
|
|
479
|
-
* connection, so it cannot trigger the admission it waits for, and Framework startup keeps not
|
|
480
|
-
* waiting for local ClientServer admission. It applies whenever nothing is selectable, including
|
|
481
|
-
* candidate sets excluded by weight 0 or drain, because `selectClientServerDealer` filters the
|
|
482
|
-
* same way the reference `SelectReady()` does.
|
|
483
|
-
*
|
|
484
|
-
* Every attempt yields to the event loop between polls. ClientServer admission completes on the
|
|
485
|
-
* monitor drains that the backend poll timer pumps, so a synchronous wait would starve the
|
|
486
|
-
* admission it is waiting for and burn the whole bound before failing anyway. That is this
|
|
487
|
-
* execution model's form of the hazard the JVM mirror avoids by not holding the admission
|
|
488
|
-
* monitor across its sleep.
|
|
489
|
-
*/
|
|
490
|
-
async awaitClientDealerForOutbound(channelName, signal, deadlineAtMs) {
|
|
491
|
-
const startedAtMs = performance.now();
|
|
492
|
-
const deadline = Math.min(deadlineAtMs ??
|
|
493
|
-
startedAtMs +
|
|
494
|
-
(this.registration.channels.get(channelName)?.requestTimeoutMs ??
|
|
495
|
-
this.registration.requestTimeoutMs ??
|
|
496
|
-
DEFAULT_REQUEST_TIMEOUT_MS), startedAtMs + CLIENT_SERVER_READY_WAIT_CAP_MS);
|
|
497
|
-
for (;;) {
|
|
498
|
-
this.drainSocketMonitors();
|
|
485
|
+
/** Observes discovery changes until the client DEALER admission deadline. */
|
|
486
|
+
async awaitClientDealerForOutbound(channelName, signal) {
|
|
487
|
+
(0, abort_1.throwIfAborted)(signal);
|
|
488
|
+
const select = () => {
|
|
499
489
|
const dealer = this.clientDealerForOutbound(channelName);
|
|
500
490
|
if (dealer !== undefined)
|
|
501
491
|
return dealer;
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
492
|
+
if (this.clientServerDiscovery.hasReadyClientServer(channelName)) {
|
|
493
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `Channel '${channelName}' has no eligible ClientServer member.`);
|
|
494
|
+
}
|
|
495
|
+
return undefined;
|
|
496
|
+
};
|
|
497
|
+
const dealer = select();
|
|
498
|
+
if (dealer !== undefined)
|
|
499
|
+
return dealer;
|
|
500
|
+
const sendTimeoutMs = configuredSendTimeoutMs(this.registration.channels.get(channelName)?.client?.sendTimeoutMs);
|
|
501
|
+
return new Promise((resolve, reject) => {
|
|
502
|
+
const cleanup = () => {
|
|
503
|
+
clearTimeout(deadline);
|
|
504
|
+
unsubscribe();
|
|
505
|
+
signal?.removeEventListener('abort', abort);
|
|
506
|
+
};
|
|
507
|
+
const abort = () => {
|
|
508
|
+
cleanup();
|
|
509
|
+
reject((0, abort_1.createAbortError)());
|
|
510
|
+
};
|
|
511
|
+
const changed = (error) => {
|
|
512
|
+
try {
|
|
513
|
+
if (error !== undefined)
|
|
514
|
+
throw error;
|
|
515
|
+
const selected = select();
|
|
516
|
+
if (selected === undefined)
|
|
517
|
+
return;
|
|
518
|
+
cleanup();
|
|
519
|
+
resolve(selected);
|
|
520
|
+
}
|
|
521
|
+
catch (error) {
|
|
522
|
+
cleanup();
|
|
523
|
+
reject(error);
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
const unsubscribe = this.clientServerDiscovery.onClientServerChanged(changed);
|
|
527
|
+
const deadline = setTimeout(() => {
|
|
528
|
+
cleanup();
|
|
529
|
+
resolve(undefined);
|
|
530
|
+
}, sendTimeoutMs);
|
|
531
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
532
|
+
// Registration and selection share one event-loop turn; recheck after subscribing.
|
|
533
|
+
changed();
|
|
534
|
+
if (signal?.aborted === true)
|
|
535
|
+
abort();
|
|
536
|
+
});
|
|
510
537
|
}
|
|
511
538
|
startManualClientServerConnections() {
|
|
512
539
|
for (const [channelName, channel] of this.registration.channels) {
|
|
@@ -535,26 +562,39 @@ class ZLinkChannelSocketRegistry {
|
|
|
535
562
|
}
|
|
536
563
|
}
|
|
537
564
|
clientServerMonitoringSource(channelName) {
|
|
538
|
-
|
|
539
|
-
|
|
565
|
+
const channel = this.registration.channels.get(channelName);
|
|
566
|
+
if (channel?.client === undefined && channel?.server === undefined) {
|
|
567
|
+
throw new configuration_1.ZLinkConfigurationException(`ClientServer channel '${channelName}' is not registered.`);
|
|
540
568
|
}
|
|
541
569
|
let disposed = false;
|
|
542
570
|
let handler;
|
|
571
|
+
const register = (next) => {
|
|
572
|
+
if (disposed)
|
|
573
|
+
return;
|
|
574
|
+
if (handler !== undefined) {
|
|
575
|
+
this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
|
|
576
|
+
}
|
|
577
|
+
handler = next;
|
|
578
|
+
let handlers = this.clientServerMonitorHandlers.get(channelName);
|
|
579
|
+
if (handlers === undefined) {
|
|
580
|
+
handlers = new Set();
|
|
581
|
+
this.clientServerMonitorHandlers.set(channelName, handlers);
|
|
582
|
+
}
|
|
583
|
+
handlers.add(next);
|
|
584
|
+
};
|
|
543
585
|
return {
|
|
544
586
|
nativeInstance: {},
|
|
545
587
|
onEvent: (next) => {
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
}
|
|
557
|
-
handlers.add(next);
|
|
588
|
+
register((event) => {
|
|
589
|
+
if (event !== undefined)
|
|
590
|
+
next(event);
|
|
591
|
+
});
|
|
592
|
+
},
|
|
593
|
+
onChange: (next) => {
|
|
594
|
+
register((event) => {
|
|
595
|
+
if (event === undefined)
|
|
596
|
+
next();
|
|
597
|
+
});
|
|
558
598
|
},
|
|
559
599
|
drain: () => 0,
|
|
560
600
|
dispose: async () => {
|
|
@@ -588,9 +628,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
588
628
|
? 1
|
|
589
629
|
: 0);
|
|
590
630
|
}
|
|
591
|
-
hasKnownClientServerTargets(channelName) {
|
|
592
|
-
return this.clientServerDiscovery.clientServerDescriptors(channelName).length > 0;
|
|
593
|
-
}
|
|
594
631
|
fanoutActiveTargets(channelName) {
|
|
595
632
|
return this.clientServerDiscovery.fanoutEndpoints(channelName);
|
|
596
633
|
}
|
|
@@ -622,6 +659,11 @@ class ZLinkChannelSocketRegistry {
|
|
|
622
659
|
this.clientServerServerDescriptors.set(channelName, descriptor);
|
|
623
660
|
this.pushClientServerDescriptorUpdate(channelName, descriptor);
|
|
624
661
|
}
|
|
662
|
+
this.notifyClientServerTopology(channelName);
|
|
663
|
+
}
|
|
664
|
+
notifyClientServerTopology(channelName) {
|
|
665
|
+
for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? [])
|
|
666
|
+
handler();
|
|
625
667
|
}
|
|
626
668
|
tryHandleClientServerControl(channelName, received, router) {
|
|
627
669
|
if (received.parts.length === 0)
|
|
@@ -648,17 +690,17 @@ class ZLinkChannelSocketRegistry {
|
|
|
648
690
|
else if (record.kind !== 'hello' ||
|
|
649
691
|
received.parts.length !== 1 ||
|
|
650
692
|
received.replyToken === null) {
|
|
651
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
693
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.ProtocolVersionUnsupported);
|
|
652
694
|
}
|
|
653
695
|
else {
|
|
654
696
|
const descriptor = this.clientServerServerDescriptors.get(channelName);
|
|
655
697
|
if (descriptor === undefined ||
|
|
656
698
|
record.hello.channelName !== channelName ||
|
|
657
699
|
record.hello.securityIdentity !== descriptor.securityIdentity) {
|
|
658
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
700
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.AdmissionMismatch);
|
|
659
701
|
}
|
|
660
702
|
else {
|
|
661
|
-
const normalizedEffectiveMaxMessageBytes = Math.min(
|
|
703
|
+
const normalizedEffectiveMaxMessageBytes = Math.min((0, client_server_service_wire_1.normalizeClientServerMessageLimit)(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
|
|
662
704
|
reply = (0, client_server_service_wire_1.encodeClientServerAdmit)(descriptor, normalizedEffectiveMaxMessageBytes);
|
|
663
705
|
this.admitClientServerServerPeer(channelName, String(received.routingId), normalizedEffectiveMaxMessageBytes);
|
|
664
706
|
}
|
|
@@ -689,7 +731,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
689
731
|
if (connection.deadlineAt === undefined)
|
|
690
732
|
continue;
|
|
691
733
|
if (nowMs >= connection.deadlineAt) {
|
|
692
|
-
this.
|
|
734
|
+
this.restartClientServerAdmission(connectionId, connection);
|
|
693
735
|
continue;
|
|
694
736
|
}
|
|
695
737
|
if (connection.nextProbeAt === undefined || nowMs < connection.nextProbeAt)
|
|
@@ -732,23 +774,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
732
774
|
throw new configuration_1.ZLinkConfigurationException(`Fanout subscriber '${channelName}' is not registered.`);
|
|
733
775
|
}
|
|
734
776
|
const subscriber = this.adapter.createSubscriberSocket(this.context);
|
|
735
|
-
subscriber.setChannelName(channelName);
|
|
736
|
-
setFanoutSubscriptions(subscriber, channel.subscriptions);
|
|
737
|
-
const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
|
|
738
777
|
const connection = {
|
|
739
778
|
channelName,
|
|
740
779
|
endpoint,
|
|
741
780
|
subscriber,
|
|
742
|
-
monitor,
|
|
743
781
|
callbacks,
|
|
744
782
|
physicalConnectionId: Symbol(connectionId),
|
|
745
783
|
transportReady: false,
|
|
746
784
|
ready: false
|
|
747
785
|
};
|
|
748
|
-
this.
|
|
749
|
-
|
|
750
|
-
this.ensureClientServerLivenessTimer();
|
|
786
|
+
this.ownedResources.add(subscriber);
|
|
787
|
+
const created = [subscriber];
|
|
751
788
|
try {
|
|
789
|
+
this.fanoutConnections.set(connectionId, connection);
|
|
790
|
+
subscriber.setChannelName(channelName);
|
|
791
|
+
setFanoutSubscriptions(subscriber, channel.subscriptions);
|
|
792
|
+
const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
|
|
793
|
+
connection.monitor = monitor;
|
|
794
|
+
created.push(monitor);
|
|
795
|
+
this.ownedResources.add(monitor);
|
|
796
|
+
this.ensureClientServerLivenessTimer();
|
|
752
797
|
monitor.onEvent((event) => {
|
|
753
798
|
if (this.fanoutConnections.get(connectionId) !== connection)
|
|
754
799
|
return;
|
|
@@ -771,30 +816,37 @@ class ZLinkChannelSocketRegistry {
|
|
|
771
816
|
}
|
|
772
817
|
});
|
|
773
818
|
subscriber.connect(endpoint);
|
|
819
|
+
return subscriber;
|
|
774
820
|
}
|
|
775
821
|
catch (error) {
|
|
776
822
|
this.fanoutConnections.delete(connectionId);
|
|
777
|
-
|
|
778
|
-
|
|
823
|
+
void Promise.allSettled(created.map(async (resource) => {
|
|
824
|
+
await resource.dispose();
|
|
825
|
+
this.ownedResources.delete(resource);
|
|
826
|
+
})).then((results) => {
|
|
827
|
+
for (const result of results)
|
|
828
|
+
if (result.status === 'rejected')
|
|
829
|
+
this.oneWayFailureSink?.(result.reason);
|
|
830
|
+
});
|
|
779
831
|
throw error;
|
|
780
832
|
}
|
|
781
|
-
return subscriber;
|
|
782
833
|
}
|
|
783
834
|
async closeFanoutSubscriberConnection(connectionId) {
|
|
784
835
|
const connection = this.fanoutConnections.get(connectionId);
|
|
785
836
|
if (connection === undefined)
|
|
786
837
|
return;
|
|
787
|
-
this.fanoutConnections.delete(connectionId);
|
|
788
838
|
try {
|
|
789
839
|
connection.subscriber.disconnect(connection.endpoint);
|
|
790
840
|
}
|
|
791
841
|
catch {
|
|
792
|
-
//
|
|
842
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
793
843
|
}
|
|
794
|
-
this.ownedMonitors.delete(connection.monitor);
|
|
795
844
|
const results = await Promise.allSettled([
|
|
796
|
-
connection.monitor
|
|
797
|
-
|
|
845
|
+
connection.monitor?.dispose(),
|
|
846
|
+
(async () => {
|
|
847
|
+
await connection.subscriber.dispose();
|
|
848
|
+
this.ownedResources.delete(connection.subscriber);
|
|
849
|
+
})()
|
|
798
850
|
]);
|
|
799
851
|
const errors = results
|
|
800
852
|
.filter((result) => result.status === 'rejected')
|
|
@@ -804,6 +856,9 @@ class ZLinkChannelSocketRegistry {
|
|
|
804
856
|
if (errors.length > 1) {
|
|
805
857
|
throw new AggregateError(errors, `Fanout connection '${connectionId}' cleanup failed.`);
|
|
806
858
|
}
|
|
859
|
+
this.fanoutConnections.delete(connectionId);
|
|
860
|
+
if (connection.monitor !== undefined)
|
|
861
|
+
this.ownedResources.delete(connection.monitor);
|
|
807
862
|
}
|
|
808
863
|
handleFanoutInbound(connectionId, topicMessage, source, nowMs = performance.now()) {
|
|
809
864
|
return this.handleFanoutInboundResult(connectionId, topicMessage, source, nowMs).consumed;
|
|
@@ -993,10 +1048,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
993
1048
|
}
|
|
994
1049
|
}
|
|
995
1050
|
drainClientServerControl(connectionId, connection) {
|
|
996
|
-
if (connection.terminationRequested)
|
|
997
|
-
return;
|
|
998
1051
|
for (;;) {
|
|
999
|
-
if (!connection.readablePoller.wait(0))
|
|
1052
|
+
if (connection.readablePoller === undefined || !connection.readablePoller.wait(0))
|
|
1000
1053
|
return;
|
|
1001
1054
|
const received = connection.dealer.recv(1);
|
|
1002
1055
|
if (received === undefined) {
|
|
@@ -1025,7 +1078,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1025
1078
|
this.applyClientServerDescriptorUpdate(connectionId, connection, record.admission);
|
|
1026
1079
|
}
|
|
1027
1080
|
catch (error) {
|
|
1028
|
-
this.
|
|
1081
|
+
this.restartClientServerAdmission(connectionId, connection);
|
|
1029
1082
|
this.oneWayFailureSink?.(error);
|
|
1030
1083
|
return;
|
|
1031
1084
|
}
|
|
@@ -1034,18 +1087,30 @@ class ZLinkChannelSocketRegistry {
|
|
|
1034
1087
|
}
|
|
1035
1088
|
}
|
|
1036
1089
|
}
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1090
|
+
/**
|
|
1091
|
+
* Ends the current logical admission of this connection: later replies of
|
|
1092
|
+
* the fenced attempt no longer apply and its ready target is withdrawn.
|
|
1093
|
+
*/
|
|
1094
|
+
endClientServerAdmission(connectionId, connection, routingId, endpoint) {
|
|
1041
1095
|
connection.physicalConnectionId = Symbol(connectionId);
|
|
1042
1096
|
connection.admissionAttempt = undefined;
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
connection.dealer.disconnect(connection.endpoint);
|
|
1097
|
+
if (connection.readyConnectionId !== undefined) {
|
|
1098
|
+
this.removeReadyConnection(connection.readyConnectionId);
|
|
1046
1099
|
}
|
|
1047
|
-
|
|
1048
|
-
|
|
1100
|
+
for (const callbacks of [...connection.callbacksByAlias.values()]) {
|
|
1101
|
+
callbacks.onTerminated(routingId, endpoint);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
/**
|
|
1105
|
+
* A peer deadline or an invalid pushed control ends only the current logical
|
|
1106
|
+
* admission. The connect intent stays with Core, which owns the endpoint
|
|
1107
|
+
* reconnect (transport liveness §6); the service handshake starts again on
|
|
1108
|
+
* the existing admission path.
|
|
1109
|
+
*/
|
|
1110
|
+
restartClientServerAdmission(connectionId, connection) {
|
|
1111
|
+
this.endClientServerAdmission(connectionId, connection, undefined, connection.endpoint);
|
|
1112
|
+
for (const callbacks of [...connection.callbacksByAlias.values()]) {
|
|
1113
|
+
callbacks.onTransportReady('', connection.endpoint);
|
|
1049
1114
|
}
|
|
1050
1115
|
}
|
|
1051
1116
|
applyClientServerDescriptorUpdate(connectionId, connection, admission) {
|
|
@@ -1088,12 +1153,13 @@ class ZLinkChannelSocketRegistry {
|
|
|
1088
1153
|
ensureClientServerLivenessTimer() {
|
|
1089
1154
|
if (this.clientServerLivenessTimer !== undefined)
|
|
1090
1155
|
return;
|
|
1091
|
-
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(),
|
|
1156
|
+
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), CLIENT_SERVER_LIVENESS_TICK_MS);
|
|
1092
1157
|
this.clientServerLivenessTimer.unref();
|
|
1093
1158
|
}
|
|
1094
1159
|
drainSocketMonitors() {
|
|
1095
|
-
for (const monitor of this.
|
|
1096
|
-
monitor
|
|
1160
|
+
for (const monitor of this.ownedResources)
|
|
1161
|
+
if ('drain' in monitor)
|
|
1162
|
+
monitor.drain();
|
|
1097
1163
|
}
|
|
1098
1164
|
removeReadyConnection(connectionId) {
|
|
1099
1165
|
const identity = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -1110,6 +1176,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1110
1176
|
connection.nextProbeAt = undefined;
|
|
1111
1177
|
connection.outstandingProbeId = undefined;
|
|
1112
1178
|
}
|
|
1179
|
+
this.notifyClientServerTopology(identity.channelName);
|
|
1113
1180
|
}
|
|
1114
1181
|
requestClientServerLiveness(connectionId, connection, probeId) {
|
|
1115
1182
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerLivenessProbe)(probeId));
|
|
@@ -1203,7 +1270,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1203
1270
|
}
|
|
1204
1271
|
allocateClientServerProbeId() {
|
|
1205
1272
|
const result = this.nextClientServerProbeId;
|
|
1206
|
-
this.nextClientServerProbeId = result ===
|
|
1273
|
+
this.nextClientServerProbeId = result === stream_wire_1.UINT64_MAX ? 1n : result + 1n;
|
|
1207
1274
|
return result;
|
|
1208
1275
|
}
|
|
1209
1276
|
publisher(channelName) {
|
|
@@ -1219,25 +1286,18 @@ class ZLinkChannelSocketRegistry {
|
|
|
1219
1286
|
throw new configuration_1.ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
|
|
1220
1287
|
}
|
|
1221
1288
|
const publisher = this.adapter.createPublisherSocket(this.context);
|
|
1289
|
+
this.publishers.set(channelName, publisher);
|
|
1222
1290
|
publisher.setChannelName(channelName);
|
|
1223
1291
|
applyFanoutPublisherSocketOptions(publisher, channel);
|
|
1224
1292
|
publisher.bind(channel.publisher.bind);
|
|
1225
|
-
|
|
1293
|
+
const endpoint = (0, configuration_1.buildAdvertisedEndpoint)(publisher.lastEndpoint ?? channel.publisher.bind, channel.publisher.advertiseHost);
|
|
1294
|
+
if (endpoint !== undefined && endpoint.length > 0) {
|
|
1295
|
+
this.recordListener('fanout', channelName, endpoint);
|
|
1296
|
+
}
|
|
1226
1297
|
this.fanoutPublisherNextBeacon.set(channelName, performance.now() + CLIENT_SERVER_PROBE_INTERVAL_MS);
|
|
1227
1298
|
this.ensureClientServerLivenessTimer();
|
|
1228
1299
|
return publisher;
|
|
1229
1300
|
}
|
|
1230
|
-
fanoutPublisherEndpoint(channelName) {
|
|
1231
|
-
const channel = this.registration.channels.get(channelName);
|
|
1232
|
-
const publisher = this.publishers.get(channelName);
|
|
1233
|
-
const boundEndpoint = publisher?.lastEndpoint;
|
|
1234
|
-
if (channel?.publisher === undefined ||
|
|
1235
|
-
boundEndpoint === undefined ||
|
|
1236
|
-
boundEndpoint.length === 0) {
|
|
1237
|
-
return undefined;
|
|
1238
|
-
}
|
|
1239
|
-
return advertisedEndpoint(boundEndpoint, channel.publisher.advertiseHost);
|
|
1240
|
-
}
|
|
1241
1301
|
routeRouter(routerChannelId) {
|
|
1242
1302
|
const existing = this.routeRouters.get(routerChannelId);
|
|
1243
1303
|
if (existing !== undefined) {
|
|
@@ -1248,6 +1308,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1248
1308
|
throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
|
|
1249
1309
|
}
|
|
1250
1310
|
const router = this.adapter.createRouterSocket(this.context);
|
|
1311
|
+
this.routeRouters.set(routerChannelId, router);
|
|
1251
1312
|
this.registerReceiveFlowSocket(router);
|
|
1252
1313
|
router.setChannelName(routerChannelId);
|
|
1253
1314
|
if ((routeChannel.manualConnections?.length ?? 0) > 0 &&
|
|
@@ -1255,7 +1316,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1255
1316
|
router.setProbe(true);
|
|
1256
1317
|
}
|
|
1257
1318
|
router.setRoutingId(routeChannel.routingId ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${(0, node_crypto_1.randomUUID)()}`);
|
|
1258
|
-
const publicWeight = routeChannel.weight ??
|
|
1319
|
+
const publicWeight = routeChannel.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1259
1320
|
this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
|
|
1260
1321
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
1261
1322
|
applySocketConfig(router, routeChannel);
|
|
@@ -1269,7 +1330,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
1269
1330
|
if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
|
|
1270
1331
|
router.bind(routeChannel.bind);
|
|
1271
1332
|
}
|
|
1272
|
-
this.routeRouters.set(routerChannelId, router);
|
|
1273
1333
|
return router;
|
|
1274
1334
|
}
|
|
1275
1335
|
routeMeshSocket(routerChannelId) {
|
|
@@ -1277,7 +1337,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1277
1337
|
}
|
|
1278
1338
|
routeMeshWeight(routerChannelId) {
|
|
1279
1339
|
this.routeRouter(routerChannelId);
|
|
1280
|
-
return this.routeMeshPublicWeights.get(routerChannelId) ??
|
|
1340
|
+
return this.routeMeshPublicWeights.get(routerChannelId) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1281
1341
|
}
|
|
1282
1342
|
setRouteMeshWeight(routerChannelId, weight) {
|
|
1283
1343
|
requirePublicWeight(weight);
|
|
@@ -1299,7 +1359,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1299
1359
|
return;
|
|
1300
1360
|
}
|
|
1301
1361
|
const monitor = this.monitoringAdapter.openSocketMonitor(socket);
|
|
1302
|
-
this.
|
|
1362
|
+
this.ownedResources.add(monitor);
|
|
1303
1363
|
monitor.onEvent((event) => {
|
|
1304
1364
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
|
|
1305
1365
|
event.remoteAddr.length > 0) {
|
|
@@ -1312,7 +1372,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1312
1372
|
return;
|
|
1313
1373
|
}
|
|
1314
1374
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
1315
|
-
this.
|
|
1375
|
+
this.ownedResources.add(monitor);
|
|
1316
1376
|
monitor.onEvent((event) => {
|
|
1317
1377
|
const routingId = event.routingId === undefined ? undefined : String(event.routingId);
|
|
1318
1378
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady &&
|
|
@@ -1341,7 +1401,7 @@ async function requestClientServerAdmission(dealer, channelName, securityIdentit
|
|
|
1341
1401
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerHello)({
|
|
1342
1402
|
channelName,
|
|
1343
1403
|
securityIdentity,
|
|
1344
|
-
normalizedEffectiveMaxMessageBytes:
|
|
1404
|
+
normalizedEffectiveMaxMessageBytes: (0, client_server_service_wire_1.normalizeClientServerMessageLimit)(dealer.maxMessageSize)
|
|
1345
1405
|
}));
|
|
1346
1406
|
try {
|
|
1347
1407
|
const parts = await dealer.request(message, timeoutMs);
|
|
@@ -1404,13 +1464,14 @@ function setFanoutSubscriptions(subscriber, applicationTopics) {
|
|
|
1404
1464
|
}
|
|
1405
1465
|
function deriveRoutingId(baseRoutingId, suffix) {
|
|
1406
1466
|
const derived = `${baseRoutingId}\0${suffix}`;
|
|
1407
|
-
if (Buffer.byteLength(derived, 'utf8') >
|
|
1408
|
-
throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the
|
|
1467
|
+
if (Buffer.byteLength(derived, 'utf8') > CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES) {
|
|
1468
|
+
throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the ${CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES} byte limit.`);
|
|
1409
1469
|
}
|
|
1410
1470
|
return derived;
|
|
1411
1471
|
}
|
|
1412
1472
|
function applyFanoutPublisherSocketOptions(publisher, channel) {
|
|
1413
1473
|
publisher.noDrop = channel.noDrop ?? false;
|
|
1474
|
+
publisher.sendTimeoutMs = configuredSendTimeoutMs(channel.publisher?.sendTimeoutMs);
|
|
1414
1475
|
}
|
|
1415
1476
|
function fanoutDiscoveryConnectionId(connectionId) {
|
|
1416
1477
|
return `fanout:${connectionId.replaceAll('\0', '/')}`;
|
|
@@ -1429,12 +1490,9 @@ function advertisedEndpoint(boundEndpoint, advertiseHost) {
|
|
|
1429
1490
|
}
|
|
1430
1491
|
return result;
|
|
1431
1492
|
}
|
|
1432
|
-
function normalizedMessageLimit(value) {
|
|
1433
|
-
return Number.isSafeInteger(value) && value > 0 ? Math.min(value, 0xffff_ffff) : 0x7fff_ffff;
|
|
1434
|
-
}
|
|
1435
1493
|
function requirePublicWeight(weight) {
|
|
1436
|
-
if (!
|
|
1437
|
-
throw new configuration_1.ZLinkConfigurationException(
|
|
1494
|
+
if (!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(weight)) {
|
|
1495
|
+
throw new configuration_1.ZLinkConfigurationException(`Weight must be an integer in 0..${RegistrationBuilderPolicy_1.ZLINK_MAX_PUBLIC_WEIGHT}.`);
|
|
1438
1496
|
}
|
|
1439
1497
|
}
|
|
1440
1498
|
function rawAvailabilityWeight(weight) {
|
|
@@ -1459,3 +1517,6 @@ function applySocketConfig(socket, config) {
|
|
|
1459
1517
|
socket.maxMessageSize = config.maxMessageSize;
|
|
1460
1518
|
}
|
|
1461
1519
|
}
|
|
1520
|
+
function configuredSendTimeoutMs(value) {
|
|
1521
|
+
return value ?? DEFAULT_SEND_TIMEOUT_MS;
|
|
1522
|
+
}
|