@zlink-systems/framework 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +15 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +1 -2
- package/dist/runtime/activation-admission.js +2 -6
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +13 -11
- package/dist/runtime/actors/actor-handoff.d.ts +4 -4
- package/dist/runtime/actors/actor-handoff.js +8 -8
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +83 -105
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +1 -1
- package/dist/runtime/actors/actor-remote-joiner.js +5 -9
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +11 -6
- package/dist/runtime/actors/deferred-join-completion.js +1 -0
- package/dist/runtime/actors/index.d.ts +9 -7
- package/dist/runtime/actors/index.js +87 -69
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +2 -0
- package/dist/runtime/admission.js +7 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +6 -23
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +1 -17
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +1 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -6
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +6 -7
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.js +40 -16
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +14 -15
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +146 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +3 -2
- package/dist/runtime/backend/raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -8
- package/dist/runtime/channels/channel-clients.js +68 -52
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -10
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.js +5 -2
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +248 -174
- package/dist/runtime/channels/channel-transports.d.ts +11 -17
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +130 -72
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +12 -9
- package/dist/runtime/execution/index.js +58 -14
- package/dist/runtime/execution/serial-execution-queue.d.ts +8 -2
- package/dist/runtime/execution/serial-execution-queue.js +54 -15
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +8 -5
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +62 -83
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +22 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +0 -6
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-object-owner.js +3 -2
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -12
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +26 -25
- package/dist/runtime/foundation/service-stateful-runtime.js +217 -204
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +3 -3
- package/dist/runtime/foundation/service-stateful-wire-codec.js +89 -55
- package/dist/runtime/foundation/service-topology-registry.d.ts +0 -1
- package/dist/runtime/foundation/service-topology-registry.js +17 -32
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +16 -18
- package/dist/runtime/host/actor-transfer-runtime.js +143 -176
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +14 -13
- package/dist/runtime/host/index.js +190 -157
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +7 -20
- package/dist/runtime/host/route-mesh-runtime.d.ts +13 -11
- package/dist/runtime/host/route-mesh-runtime.js +171 -252
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +21 -30
- package/dist/runtime/host/service-relocation-host-runtime.js +508 -416
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -10
- package/dist/runtime/host/spot-runtime-options-factory.js +50 -14
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +3 -3
- package/dist/runtime/host/user-spot-creation-coordinator.js +11 -8
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +72 -22
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +4 -9
- package/dist/runtime/locations/lifecycle.js +2 -31
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +37 -28
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +6 -0
- package/dist/runtime/locations/spot-location-claims.js +42 -1
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +12 -7
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +4 -1
- package/dist/runtime/spots/index.d.ts +14 -20
- package/dist/runtime/spots/index.js +302 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +3 -5
- package/dist/runtime/spots/spot-activation-registry.js +14 -50
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +2 -2
- package/dist/runtime/spots/spot-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-activation.js +49 -32
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +4 -52
- package/dist/runtime/spots/spot-actor-membership.d.ts +4 -6
- package/dist/runtime/spots/spot-actor-membership.js +22 -45
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +9 -20
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +5 -4
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +67 -72
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +9 -8
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -3
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -12
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +1 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +0 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +2 -16
- package/dist/runtime/spots/spot-serial-executor.js +2 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +27 -7
- package/dist/runtime/spots/spot-serial-turn-executor.js +83 -11
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +16 -29
- package/dist/runtime/streams/actor-session-binding-registry.js +142 -212
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +11 -1
- package/dist/runtime/streams/index.d.ts +14 -15
- package/dist/runtime/streams/index.js +20 -21
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +14 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +2 -8
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +39 -33
- package/src/runtime/actors/actor-handoff.ts +24 -22
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +172 -174
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +9 -11
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +10 -6
- package/src/runtime/actors/index.ts +100 -79
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +8 -1
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +13 -29
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +2 -18
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-support.ts +23 -6
- package/src/runtime/backend/node/node-event-loop-poller.ts +8 -12
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +41 -20
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +3 -2
- package/src/runtime/backend/raw-binding-port.ts +1 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -85
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -23
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +6 -2
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +301 -192
- package/src/runtime/channels/channel-transports.ts +161 -112
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +172 -91
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +60 -20
- package/src/runtime/execution/serial-execution-queue.ts +131 -18
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +110 -111
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +31 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +0 -10
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-object-owner.ts +5 -2
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -17
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +322 -276
- package/src/runtime/foundation/service-stateful-wire-codec.ts +128 -80
- package/src/runtime/foundation/service-topology-registry.ts +23 -32
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +180 -260
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +327 -296
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +8 -41
- package/src/runtime/host/route-mesh-runtime.ts +228 -271
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +699 -561
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +73 -22
- package/src/runtime/host/user-spot-creation-coordinator.ts +36 -22
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +100 -25
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +13 -43
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +75 -49
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +58 -1
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +18 -8
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +1 -1
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +4 -1
- package/src/runtime/spots/index.ts +433 -229
- package/src/runtime/spots/spot-activation-registry.ts +30 -69
- package/src/runtime/spots/spot-activation-state.ts +2 -2
- package/src/runtime/spots/spot-activation.ts +67 -37
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +24 -77
- package/src/runtime/spots/spot-actor-membership.ts +40 -72
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -30
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +21 -17
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +136 -125
- package/src/runtime/spots/spot-outbound.ts +45 -23
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -26
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +2 -3
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +5 -27
- package/src/runtime/spots/spot-serial-executor.ts +2 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +112 -11
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +179 -269
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +0 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +21 -1
- package/src/runtime/streams/index.ts +76 -64
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkChannelSocketRegistry = void 0;
|
|
4
|
-
const
|
|
4
|
+
const disposal_1 = require("../disposal");
|
|
5
|
+
const stream_wire_1 = require("@zlink-systems/stream-wire");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
7
|
const contracts_1 = require("../../contracts");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const abort_1 = require("../abort");
|
|
8
|
+
const CoreTypes_1 = require("../../contracts/Common/CoreTypes");
|
|
9
|
+
const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
|
|
9
10
|
const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
|
|
10
|
-
const
|
|
11
|
-
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
12
|
-
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
const abort_1 = require("../abort");
|
|
13
12
|
const runtime_message_1 = require("../backend/runtime-message");
|
|
14
|
-
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");
|
|
15
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");
|
|
16
20
|
const service_wire_m6a_codec_1 = require("../foundation/service-wire-m6a-codec");
|
|
21
|
+
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
17
22
|
const client_server_service_wire_1 = require("./client-server-service-wire");
|
|
18
23
|
const fanout_service_wire_1 = require("./fanout-service-wire");
|
|
19
|
-
const
|
|
24
|
+
const route_member_snapshot_1 = require("./route-member-snapshot");
|
|
20
25
|
const MAX_LIFECYCLE_GENERATION = 0x7fffffffffffffffn;
|
|
21
|
-
const CLIENT_SERVER_PROBE_INTERVAL_MS =
|
|
22
|
-
const CLIENT_SERVER_PEER_DEADLINE_MS =
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
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;
|
|
26
30
|
class ZLinkChannelSocketRegistry {
|
|
27
31
|
registration;
|
|
28
32
|
adapter;
|
|
@@ -44,7 +48,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
44
48
|
routeMeshPublicWeights = new Map();
|
|
45
49
|
clientServerAdmittedClients = new Map();
|
|
46
50
|
clientServerServerPeers = new Map();
|
|
47
|
-
|
|
51
|
+
disposal = new disposal_1.RuntimeDisposal();
|
|
52
|
+
ownedResources = new Set();
|
|
48
53
|
fanoutConnections = new Map();
|
|
49
54
|
fanoutPublisherNextBeacon = new Map();
|
|
50
55
|
clientServerLivenessTimer;
|
|
@@ -62,9 +67,13 @@ class ZLinkChannelSocketRegistry {
|
|
|
62
67
|
this.applicationJobQueue = applicationJobQueue;
|
|
63
68
|
this.listenerRecords = listenerRecords ?? new listener_records_1.ZLinkListenerRecords();
|
|
64
69
|
}
|
|
65
|
-
|
|
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.'));
|
|
66
75
|
const clientServerConnections = [...new Set(this.clientServerConnections.values())];
|
|
67
|
-
const clientServerPollers = clientServerConnections.
|
|
76
|
+
const clientServerPollers = clientServerConnections.flatMap((connection) => connection.readablePoller === undefined ? [] : [connection.readablePoller]);
|
|
68
77
|
const sockets = [
|
|
69
78
|
...this.clientDealers.values(),
|
|
70
79
|
...clientServerConnections.map((value) => value.dealer),
|
|
@@ -80,8 +89,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
80
89
|
...this.routeRouters.values()
|
|
81
90
|
]))
|
|
82
91
|
this.unregisterReceiveFlowSocket(socket);
|
|
83
|
-
this.clientDealers.clear();
|
|
84
|
-
this.clientServerConnections.clear();
|
|
85
92
|
this.clientServerReadyIdentities.clear();
|
|
86
93
|
this.clientServerServerDescriptors.clear();
|
|
87
94
|
this.clientServerPublicWeights.clear();
|
|
@@ -91,23 +98,40 @@ class ZLinkChannelSocketRegistry {
|
|
|
91
98
|
this.clientServerMonitorHandlers.clear();
|
|
92
99
|
this.fanoutMonitorHandlers.clear();
|
|
93
100
|
this.fanoutTopologyHandlers.clear();
|
|
94
|
-
this.fanoutConnections.clear();
|
|
95
101
|
this.fanoutPublisherNextBeacon.clear();
|
|
96
102
|
if (this.clientServerLivenessTimer !== undefined) {
|
|
97
103
|
clearInterval(this.clientServerLivenessTimer);
|
|
98
104
|
this.clientServerLivenessTimer = undefined;
|
|
99
105
|
}
|
|
100
|
-
this.channelRouters.clear();
|
|
101
|
-
this.publishers.clear();
|
|
102
|
-
this.routeRouters.clear();
|
|
103
106
|
this.routeMembers.clear();
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
+
}));
|
|
111
135
|
const errors = cleanup
|
|
112
136
|
.filter((result) => result.status === 'rejected')
|
|
113
137
|
.map((result) => result.reason);
|
|
@@ -127,13 +151,16 @@ class ZLinkChannelSocketRegistry {
|
|
|
127
151
|
throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
|
|
128
152
|
}
|
|
129
153
|
const dealer = this.adapter.createDealerSocket(this.context);
|
|
154
|
+
this.clientDealers.set(channelName, dealer);
|
|
130
155
|
this.registerReceiveFlowSocket(dealer);
|
|
131
156
|
dealer.setChannelName(channelName);
|
|
132
157
|
if (channel?.routingId !== undefined && channel.routingId.length > 0) {
|
|
133
158
|
dealer.setRoutingId(deriveRoutingId(channel.routingId, 'dealer'));
|
|
134
159
|
}
|
|
135
|
-
applySocketConfig(dealer,
|
|
136
|
-
|
|
160
|
+
applySocketConfig(dealer, {
|
|
161
|
+
...client,
|
|
162
|
+
sendTimeoutMs: configuredSendTimeoutMs(client.sendTimeoutMs)
|
|
163
|
+
});
|
|
137
164
|
return dealer;
|
|
138
165
|
}
|
|
139
166
|
channelRouter(channelName) {
|
|
@@ -149,6 +176,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
149
176
|
throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
|
|
150
177
|
}
|
|
151
178
|
const router = this.adapter.createRouterSocket(this.context);
|
|
179
|
+
this.channelRouters.set(channelName, router);
|
|
152
180
|
this.registerReceiveFlowSocket(router);
|
|
153
181
|
router.setChannelName(channelName);
|
|
154
182
|
const identity = this.clientServerIdentities.get(channelName) ?? {
|
|
@@ -157,14 +185,14 @@ class ZLinkChannelSocketRegistry {
|
|
|
157
185
|
};
|
|
158
186
|
this.clientServerIdentities.set(channelName, identity);
|
|
159
187
|
router.setRoutingId(identity.serverRid);
|
|
160
|
-
const publicWeight = channel.server.weight ??
|
|
188
|
+
const publicWeight = channel.server.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
161
189
|
this.clientServerPublicWeights.set(channelName, publicWeight);
|
|
162
190
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
163
191
|
applySocketConfig(router, channel.server);
|
|
164
192
|
router.bind(channel.server.bind);
|
|
165
193
|
if (this.monitoringAdapter !== undefined) {
|
|
166
194
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
167
|
-
this.
|
|
195
|
+
this.ownedResources.add(monitor);
|
|
168
196
|
monitor.onEvent((event) => {
|
|
169
197
|
if (event.routingId === undefined)
|
|
170
198
|
return;
|
|
@@ -179,7 +207,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
179
207
|
this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
|
|
180
208
|
});
|
|
181
209
|
}
|
|
182
|
-
this.channelRouters.set(channelName, router);
|
|
183
210
|
const endpoint = advertisedEndpoint(router.lastEndpoint ?? channel.server.bind, channel.server.advertiseHost);
|
|
184
211
|
this.recordListener('clientServer', channelName, endpoint);
|
|
185
212
|
if (!this.clientServerServerDescriptors.has(channelName)) {
|
|
@@ -219,7 +246,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
219
246
|
}
|
|
220
247
|
clientServerServerWeight(channelName) {
|
|
221
248
|
this.channelRouter(channelName);
|
|
222
|
-
return this.clientServerPublicWeights.get(channelName) ??
|
|
249
|
+
return this.clientServerPublicWeights.get(channelName) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
223
250
|
}
|
|
224
251
|
setClientServerServerWeight(channelName, weight) {
|
|
225
252
|
requirePublicWeight(weight);
|
|
@@ -240,49 +267,33 @@ class ZLinkChannelSocketRegistry {
|
|
|
240
267
|
throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
|
|
241
268
|
}
|
|
242
269
|
const dealer = this.adapter.createDealerSocket(this.context);
|
|
243
|
-
this.registerReceiveFlowSocket(dealer);
|
|
244
|
-
dealer.setChannelName(channelName);
|
|
245
|
-
dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
|
|
246
|
-
applySocketConfig(dealer, client);
|
|
247
|
-
const cleanupDealer = () => {
|
|
248
|
-
this.unregisterReceiveFlowSocket(dealer);
|
|
249
|
-
void Promise.allSettled([dealer.dispose()]);
|
|
250
|
-
};
|
|
251
|
-
let readablePoller;
|
|
252
|
-
try {
|
|
253
|
-
readablePoller = this.adapter.createReadablePoller(dealer);
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
cleanupDealer();
|
|
257
|
-
throw error;
|
|
258
|
-
}
|
|
259
|
-
let monitor;
|
|
260
|
-
try {
|
|
261
|
-
monitor = this.monitoringAdapter.openSocketMonitor(dealer);
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
try {
|
|
265
|
-
readablePoller.dispose();
|
|
266
|
-
}
|
|
267
|
-
finally {
|
|
268
|
-
cleanupDealer();
|
|
269
|
-
}
|
|
270
|
-
throw error;
|
|
271
|
-
}
|
|
272
|
-
this.ownedMonitors.add(monitor);
|
|
273
270
|
const connection = {
|
|
274
271
|
channelName,
|
|
275
272
|
endpoint,
|
|
276
273
|
dealer,
|
|
277
|
-
readablePoller,
|
|
278
|
-
monitor,
|
|
279
274
|
aliases: new Set([connectionId]),
|
|
280
275
|
callbacksByAlias: new Map([[connectionId, callbacks]]),
|
|
281
276
|
physicalConnectionId: Symbol(connectionId)
|
|
282
277
|
};
|
|
283
|
-
this.
|
|
284
|
-
|
|
278
|
+
this.ownedResources.add(dealer);
|
|
279
|
+
const created = [dealer];
|
|
285
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();
|
|
286
297
|
monitor.onEvent((event) => {
|
|
287
298
|
if (![...connection.aliases].some((alias) => this.clientServerConnections.get(alias) === connection))
|
|
288
299
|
return;
|
|
@@ -312,26 +323,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
312
323
|
}
|
|
313
324
|
});
|
|
314
325
|
dealer.connect(endpoint);
|
|
326
|
+
return dealer;
|
|
315
327
|
}
|
|
316
328
|
catch (error) {
|
|
317
329
|
this.clientServerConnections.delete(connectionId);
|
|
318
|
-
this.
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
+
});
|
|
326
339
|
throw error;
|
|
327
340
|
}
|
|
328
|
-
return dealer;
|
|
329
341
|
}
|
|
330
342
|
async closeClientServerConnection(connectionId) {
|
|
331
343
|
const current = this.clientServerConnections.get(connectionId);
|
|
332
344
|
if (current === undefined)
|
|
333
345
|
return;
|
|
334
|
-
this.clientServerConnections.delete(connectionId);
|
|
335
346
|
current.aliases.delete(connectionId);
|
|
336
347
|
current.callbacksByAlias.delete(connectionId);
|
|
337
348
|
const ready = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -351,21 +362,34 @@ class ZLinkChannelSocketRegistry {
|
|
|
351
362
|
});
|
|
352
363
|
}
|
|
353
364
|
}
|
|
354
|
-
|
|
365
|
+
this.notifyClientServerTopology(current.channelName);
|
|
366
|
+
if (current.aliases.size > 0) {
|
|
367
|
+
this.clientServerConnections.delete(connectionId);
|
|
355
368
|
return;
|
|
369
|
+
}
|
|
356
370
|
await this.disposeClientServerPhysical(connectionId, current);
|
|
371
|
+
this.clientServerConnections.delete(connectionId);
|
|
357
372
|
}
|
|
358
373
|
async disposeClientServerPhysical(connectionId, current) {
|
|
359
374
|
try {
|
|
360
375
|
current.dealer.disconnect(current.endpoint);
|
|
361
376
|
}
|
|
362
377
|
catch {
|
|
363
|
-
//
|
|
378
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
364
379
|
}
|
|
365
|
-
this.ownedMonitors.delete(current.monitor);
|
|
366
380
|
this.unregisterReceiveFlowSocket(current.dealer);
|
|
367
|
-
current.readablePoller
|
|
368
|
-
|
|
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
|
+
]);
|
|
369
393
|
const errors = results
|
|
370
394
|
.filter((result) => result.status === 'rejected')
|
|
371
395
|
.map((result) => result.reason);
|
|
@@ -374,6 +398,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
374
398
|
if (errors.length > 1) {
|
|
375
399
|
throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
|
|
376
400
|
}
|
|
401
|
+
if (current.monitor !== undefined)
|
|
402
|
+
this.ownedResources.delete(current.monitor);
|
|
377
403
|
}
|
|
378
404
|
admitClientServerConnection(descriptor, connectionId) {
|
|
379
405
|
const connection = this.clientServerConnections.get(connectionId);
|
|
@@ -383,6 +409,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
383
409
|
const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connection.readyConnectionId);
|
|
384
410
|
if (admitted)
|
|
385
411
|
connection.admittedDescriptor = descriptor;
|
|
412
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
386
413
|
return admitted;
|
|
387
414
|
}
|
|
388
415
|
const duplicateId = [...this.clientServerReadyIdentities].find(([, identity]) => identity.channelName === descriptor.channelName &&
|
|
@@ -416,6 +443,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
416
443
|
connection.readyConnectionId = connectionId;
|
|
417
444
|
connection.admittedDescriptor = descriptor;
|
|
418
445
|
}
|
|
446
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
419
447
|
return admitted;
|
|
420
448
|
}
|
|
421
449
|
removeClientServerReady(channelName, serverRoutingId, connectionId) {
|
|
@@ -430,6 +458,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
430
458
|
connection.outstandingProbeId = undefined;
|
|
431
459
|
}
|
|
432
460
|
}
|
|
461
|
+
this.notifyClientServerTopology(channelName);
|
|
433
462
|
return removed;
|
|
434
463
|
}
|
|
435
464
|
selectClientServerDealer(channelName) {
|
|
@@ -453,47 +482,58 @@ class ZLinkChannelSocketRegistry {
|
|
|
453
482
|
}
|
|
454
483
|
return undefined;
|
|
455
484
|
}
|
|
456
|
-
/**
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
* the call's remaining deadline and five seconds, mirroring the .NET reference
|
|
461
|
-
* `ZLinkClientServerClientRuntime.WaitForReadyAsync`. The wait lives here because this registry
|
|
462
|
-
* owns ClientServer connections, admission and weighted selection. Sends have no per-call
|
|
463
|
-
* timeout, so they use the Channel's request timeout.
|
|
464
|
-
*
|
|
465
|
-
* The wait only observes admission that is already in flight: it never opens or reconnects a
|
|
466
|
-
* connection, so it cannot trigger the admission it waits for, and Framework startup keeps not
|
|
467
|
-
* waiting for local ClientServer admission. It applies whenever nothing is selectable, including
|
|
468
|
-
* candidate sets excluded by weight 0 or drain, because `selectClientServerDealer` filters the
|
|
469
|
-
* same way the reference `SelectReady()` does.
|
|
470
|
-
*
|
|
471
|
-
* Every attempt yields to the event loop between polls. ClientServer admission completes on the
|
|
472
|
-
* monitor drains that the backend poll timer pumps, so a synchronous wait would starve the
|
|
473
|
-
* admission it is waiting for and burn the whole bound before failing anyway. That is this
|
|
474
|
-
* execution model's form of the hazard the JVM mirror avoids by not holding the admission
|
|
475
|
-
* monitor across its sleep.
|
|
476
|
-
*/
|
|
477
|
-
async awaitClientDealerForOutbound(channelName, signal, deadlineAtMs) {
|
|
478
|
-
const startedAtMs = performance.now();
|
|
479
|
-
const deadline = Math.min(deadlineAtMs ??
|
|
480
|
-
startedAtMs +
|
|
481
|
-
(this.registration.channels.get(channelName)?.requestTimeoutMs ??
|
|
482
|
-
this.registration.requestTimeoutMs ??
|
|
483
|
-
DEFAULT_REQUEST_TIMEOUT_MS), startedAtMs + CLIENT_SERVER_READY_WAIT_CAP_MS);
|
|
484
|
-
for (;;) {
|
|
485
|
-
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 = () => {
|
|
486
489
|
const dealer = this.clientDealerForOutbound(channelName);
|
|
487
490
|
if (dealer !== undefined)
|
|
488
491
|
return dealer;
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
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
|
+
});
|
|
497
537
|
}
|
|
498
538
|
startManualClientServerConnections() {
|
|
499
539
|
for (const [channelName, channel] of this.registration.channels) {
|
|
@@ -522,26 +562,39 @@ class ZLinkChannelSocketRegistry {
|
|
|
522
562
|
}
|
|
523
563
|
}
|
|
524
564
|
clientServerMonitoringSource(channelName) {
|
|
525
|
-
|
|
526
|
-
|
|
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.`);
|
|
527
568
|
}
|
|
528
569
|
let disposed = false;
|
|
529
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
|
+
};
|
|
530
585
|
return {
|
|
531
586
|
nativeInstance: {},
|
|
532
587
|
onEvent: (next) => {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
}
|
|
544
|
-
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
|
+
});
|
|
545
598
|
},
|
|
546
599
|
drain: () => 0,
|
|
547
600
|
dispose: async () => {
|
|
@@ -606,6 +659,11 @@ class ZLinkChannelSocketRegistry {
|
|
|
606
659
|
this.clientServerServerDescriptors.set(channelName, descriptor);
|
|
607
660
|
this.pushClientServerDescriptorUpdate(channelName, descriptor);
|
|
608
661
|
}
|
|
662
|
+
this.notifyClientServerTopology(channelName);
|
|
663
|
+
}
|
|
664
|
+
notifyClientServerTopology(channelName) {
|
|
665
|
+
for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? [])
|
|
666
|
+
handler();
|
|
609
667
|
}
|
|
610
668
|
tryHandleClientServerControl(channelName, received, router) {
|
|
611
669
|
if (received.parts.length === 0)
|
|
@@ -632,17 +690,17 @@ class ZLinkChannelSocketRegistry {
|
|
|
632
690
|
else if (record.kind !== 'hello' ||
|
|
633
691
|
received.parts.length !== 1 ||
|
|
634
692
|
received.replyToken === null) {
|
|
635
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
693
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.ProtocolVersionUnsupported);
|
|
636
694
|
}
|
|
637
695
|
else {
|
|
638
696
|
const descriptor = this.clientServerServerDescriptors.get(channelName);
|
|
639
697
|
if (descriptor === undefined ||
|
|
640
698
|
record.hello.channelName !== channelName ||
|
|
641
699
|
record.hello.securityIdentity !== descriptor.securityIdentity) {
|
|
642
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
700
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.AdmissionMismatch);
|
|
643
701
|
}
|
|
644
702
|
else {
|
|
645
|
-
const normalizedEffectiveMaxMessageBytes = Math.min(
|
|
703
|
+
const normalizedEffectiveMaxMessageBytes = Math.min((0, client_server_service_wire_1.normalizeClientServerMessageLimit)(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
|
|
646
704
|
reply = (0, client_server_service_wire_1.encodeClientServerAdmit)(descriptor, normalizedEffectiveMaxMessageBytes);
|
|
647
705
|
this.admitClientServerServerPeer(channelName, String(received.routingId), normalizedEffectiveMaxMessageBytes);
|
|
648
706
|
}
|
|
@@ -716,23 +774,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
716
774
|
throw new configuration_1.ZLinkConfigurationException(`Fanout subscriber '${channelName}' is not registered.`);
|
|
717
775
|
}
|
|
718
776
|
const subscriber = this.adapter.createSubscriberSocket(this.context);
|
|
719
|
-
subscriber.setChannelName(channelName);
|
|
720
|
-
setFanoutSubscriptions(subscriber, channel.subscriptions);
|
|
721
|
-
const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
|
|
722
777
|
const connection = {
|
|
723
778
|
channelName,
|
|
724
779
|
endpoint,
|
|
725
780
|
subscriber,
|
|
726
|
-
monitor,
|
|
727
781
|
callbacks,
|
|
728
782
|
physicalConnectionId: Symbol(connectionId),
|
|
729
783
|
transportReady: false,
|
|
730
784
|
ready: false
|
|
731
785
|
};
|
|
732
|
-
this.
|
|
733
|
-
|
|
734
|
-
this.ensureClientServerLivenessTimer();
|
|
786
|
+
this.ownedResources.add(subscriber);
|
|
787
|
+
const created = [subscriber];
|
|
735
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();
|
|
736
797
|
monitor.onEvent((event) => {
|
|
737
798
|
if (this.fanoutConnections.get(connectionId) !== connection)
|
|
738
799
|
return;
|
|
@@ -755,30 +816,37 @@ class ZLinkChannelSocketRegistry {
|
|
|
755
816
|
}
|
|
756
817
|
});
|
|
757
818
|
subscriber.connect(endpoint);
|
|
819
|
+
return subscriber;
|
|
758
820
|
}
|
|
759
821
|
catch (error) {
|
|
760
822
|
this.fanoutConnections.delete(connectionId);
|
|
761
|
-
|
|
762
|
-
|
|
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
|
+
});
|
|
763
831
|
throw error;
|
|
764
832
|
}
|
|
765
|
-
return subscriber;
|
|
766
833
|
}
|
|
767
834
|
async closeFanoutSubscriberConnection(connectionId) {
|
|
768
835
|
const connection = this.fanoutConnections.get(connectionId);
|
|
769
836
|
if (connection === undefined)
|
|
770
837
|
return;
|
|
771
|
-
this.fanoutConnections.delete(connectionId);
|
|
772
838
|
try {
|
|
773
839
|
connection.subscriber.disconnect(connection.endpoint);
|
|
774
840
|
}
|
|
775
841
|
catch {
|
|
776
|
-
//
|
|
842
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
777
843
|
}
|
|
778
|
-
this.ownedMonitors.delete(connection.monitor);
|
|
779
844
|
const results = await Promise.allSettled([
|
|
780
|
-
connection.monitor
|
|
781
|
-
|
|
845
|
+
connection.monitor?.dispose(),
|
|
846
|
+
(async () => {
|
|
847
|
+
await connection.subscriber.dispose();
|
|
848
|
+
this.ownedResources.delete(connection.subscriber);
|
|
849
|
+
})()
|
|
782
850
|
]);
|
|
783
851
|
const errors = results
|
|
784
852
|
.filter((result) => result.status === 'rejected')
|
|
@@ -788,6 +856,9 @@ class ZLinkChannelSocketRegistry {
|
|
|
788
856
|
if (errors.length > 1) {
|
|
789
857
|
throw new AggregateError(errors, `Fanout connection '${connectionId}' cleanup failed.`);
|
|
790
858
|
}
|
|
859
|
+
this.fanoutConnections.delete(connectionId);
|
|
860
|
+
if (connection.monitor !== undefined)
|
|
861
|
+
this.ownedResources.delete(connection.monitor);
|
|
791
862
|
}
|
|
792
863
|
handleFanoutInbound(connectionId, topicMessage, source, nowMs = performance.now()) {
|
|
793
864
|
return this.handleFanoutInboundResult(connectionId, topicMessage, source, nowMs).consumed;
|
|
@@ -978,7 +1049,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
978
1049
|
}
|
|
979
1050
|
drainClientServerControl(connectionId, connection) {
|
|
980
1051
|
for (;;) {
|
|
981
|
-
if (!connection.readablePoller.wait(0))
|
|
1052
|
+
if (connection.readablePoller === undefined || !connection.readablePoller.wait(0))
|
|
982
1053
|
return;
|
|
983
1054
|
const received = connection.dealer.recv(1);
|
|
984
1055
|
if (received === undefined) {
|
|
@@ -1082,12 +1153,13 @@ class ZLinkChannelSocketRegistry {
|
|
|
1082
1153
|
ensureClientServerLivenessTimer() {
|
|
1083
1154
|
if (this.clientServerLivenessTimer !== undefined)
|
|
1084
1155
|
return;
|
|
1085
|
-
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(),
|
|
1156
|
+
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), CLIENT_SERVER_LIVENESS_TICK_MS);
|
|
1086
1157
|
this.clientServerLivenessTimer.unref();
|
|
1087
1158
|
}
|
|
1088
1159
|
drainSocketMonitors() {
|
|
1089
|
-
for (const monitor of this.
|
|
1090
|
-
monitor
|
|
1160
|
+
for (const monitor of this.ownedResources)
|
|
1161
|
+
if ('drain' in monitor)
|
|
1162
|
+
monitor.drain();
|
|
1091
1163
|
}
|
|
1092
1164
|
removeReadyConnection(connectionId) {
|
|
1093
1165
|
const identity = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -1104,6 +1176,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1104
1176
|
connection.nextProbeAt = undefined;
|
|
1105
1177
|
connection.outstandingProbeId = undefined;
|
|
1106
1178
|
}
|
|
1179
|
+
this.notifyClientServerTopology(identity.channelName);
|
|
1107
1180
|
}
|
|
1108
1181
|
requestClientServerLiveness(connectionId, connection, probeId) {
|
|
1109
1182
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerLivenessProbe)(probeId));
|
|
@@ -1197,7 +1270,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1197
1270
|
}
|
|
1198
1271
|
allocateClientServerProbeId() {
|
|
1199
1272
|
const result = this.nextClientServerProbeId;
|
|
1200
|
-
this.nextClientServerProbeId = result ===
|
|
1273
|
+
this.nextClientServerProbeId = result === stream_wire_1.UINT64_MAX ? 1n : result + 1n;
|
|
1201
1274
|
return result;
|
|
1202
1275
|
}
|
|
1203
1276
|
publisher(channelName) {
|
|
@@ -1213,10 +1286,10 @@ class ZLinkChannelSocketRegistry {
|
|
|
1213
1286
|
throw new configuration_1.ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
|
|
1214
1287
|
}
|
|
1215
1288
|
const publisher = this.adapter.createPublisherSocket(this.context);
|
|
1289
|
+
this.publishers.set(channelName, publisher);
|
|
1216
1290
|
publisher.setChannelName(channelName);
|
|
1217
1291
|
applyFanoutPublisherSocketOptions(publisher, channel);
|
|
1218
1292
|
publisher.bind(channel.publisher.bind);
|
|
1219
|
-
this.publishers.set(channelName, publisher);
|
|
1220
1293
|
const endpoint = (0, configuration_1.buildAdvertisedEndpoint)(publisher.lastEndpoint ?? channel.publisher.bind, channel.publisher.advertiseHost);
|
|
1221
1294
|
if (endpoint !== undefined && endpoint.length > 0) {
|
|
1222
1295
|
this.recordListener('fanout', channelName, endpoint);
|
|
@@ -1235,6 +1308,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1235
1308
|
throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
|
|
1236
1309
|
}
|
|
1237
1310
|
const router = this.adapter.createRouterSocket(this.context);
|
|
1311
|
+
this.routeRouters.set(routerChannelId, router);
|
|
1238
1312
|
this.registerReceiveFlowSocket(router);
|
|
1239
1313
|
router.setChannelName(routerChannelId);
|
|
1240
1314
|
if ((routeChannel.manualConnections?.length ?? 0) > 0 &&
|
|
@@ -1242,7 +1316,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1242
1316
|
router.setProbe(true);
|
|
1243
1317
|
}
|
|
1244
1318
|
router.setRoutingId(routeChannel.routingId ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${(0, node_crypto_1.randomUUID)()}`);
|
|
1245
|
-
const publicWeight = routeChannel.weight ??
|
|
1319
|
+
const publicWeight = routeChannel.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1246
1320
|
this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
|
|
1247
1321
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
1248
1322
|
applySocketConfig(router, routeChannel);
|
|
@@ -1256,7 +1330,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
1256
1330
|
if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
|
|
1257
1331
|
router.bind(routeChannel.bind);
|
|
1258
1332
|
}
|
|
1259
|
-
this.routeRouters.set(routerChannelId, router);
|
|
1260
1333
|
return router;
|
|
1261
1334
|
}
|
|
1262
1335
|
routeMeshSocket(routerChannelId) {
|
|
@@ -1264,7 +1337,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1264
1337
|
}
|
|
1265
1338
|
routeMeshWeight(routerChannelId) {
|
|
1266
1339
|
this.routeRouter(routerChannelId);
|
|
1267
|
-
return this.routeMeshPublicWeights.get(routerChannelId) ??
|
|
1340
|
+
return this.routeMeshPublicWeights.get(routerChannelId) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1268
1341
|
}
|
|
1269
1342
|
setRouteMeshWeight(routerChannelId, weight) {
|
|
1270
1343
|
requirePublicWeight(weight);
|
|
@@ -1286,7 +1359,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1286
1359
|
return;
|
|
1287
1360
|
}
|
|
1288
1361
|
const monitor = this.monitoringAdapter.openSocketMonitor(socket);
|
|
1289
|
-
this.
|
|
1362
|
+
this.ownedResources.add(monitor);
|
|
1290
1363
|
monitor.onEvent((event) => {
|
|
1291
1364
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
|
|
1292
1365
|
event.remoteAddr.length > 0) {
|
|
@@ -1299,7 +1372,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1299
1372
|
return;
|
|
1300
1373
|
}
|
|
1301
1374
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
1302
|
-
this.
|
|
1375
|
+
this.ownedResources.add(monitor);
|
|
1303
1376
|
monitor.onEvent((event) => {
|
|
1304
1377
|
const routingId = event.routingId === undefined ? undefined : String(event.routingId);
|
|
1305
1378
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady &&
|
|
@@ -1328,7 +1401,7 @@ async function requestClientServerAdmission(dealer, channelName, securityIdentit
|
|
|
1328
1401
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerHello)({
|
|
1329
1402
|
channelName,
|
|
1330
1403
|
securityIdentity,
|
|
1331
|
-
normalizedEffectiveMaxMessageBytes:
|
|
1404
|
+
normalizedEffectiveMaxMessageBytes: (0, client_server_service_wire_1.normalizeClientServerMessageLimit)(dealer.maxMessageSize)
|
|
1332
1405
|
}));
|
|
1333
1406
|
try {
|
|
1334
1407
|
const parts = await dealer.request(message, timeoutMs);
|
|
@@ -1391,13 +1464,14 @@ function setFanoutSubscriptions(subscriber, applicationTopics) {
|
|
|
1391
1464
|
}
|
|
1392
1465
|
function deriveRoutingId(baseRoutingId, suffix) {
|
|
1393
1466
|
const derived = `${baseRoutingId}\0${suffix}`;
|
|
1394
|
-
if (Buffer.byteLength(derived, 'utf8') >
|
|
1395
|
-
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.`);
|
|
1396
1469
|
}
|
|
1397
1470
|
return derived;
|
|
1398
1471
|
}
|
|
1399
1472
|
function applyFanoutPublisherSocketOptions(publisher, channel) {
|
|
1400
1473
|
publisher.noDrop = channel.noDrop ?? false;
|
|
1474
|
+
publisher.sendTimeoutMs = configuredSendTimeoutMs(channel.publisher?.sendTimeoutMs);
|
|
1401
1475
|
}
|
|
1402
1476
|
function fanoutDiscoveryConnectionId(connectionId) {
|
|
1403
1477
|
return `fanout:${connectionId.replaceAll('\0', '/')}`;
|
|
@@ -1416,12 +1490,9 @@ function advertisedEndpoint(boundEndpoint, advertiseHost) {
|
|
|
1416
1490
|
}
|
|
1417
1491
|
return result;
|
|
1418
1492
|
}
|
|
1419
|
-
function normalizedMessageLimit(value) {
|
|
1420
|
-
return Number.isSafeInteger(value) && value > 0 ? Math.min(value, 0xffff_ffff) : 0x7fff_ffff;
|
|
1421
|
-
}
|
|
1422
1493
|
function requirePublicWeight(weight) {
|
|
1423
|
-
if (!
|
|
1424
|
-
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}.`);
|
|
1425
1496
|
}
|
|
1426
1497
|
}
|
|
1427
1498
|
function rawAvailabilityWeight(weight) {
|
|
@@ -1446,3 +1517,6 @@ function applySocketConfig(socket, config) {
|
|
|
1446
1517
|
socket.maxMessageSize = config.maxMessageSize;
|
|
1447
1518
|
}
|
|
1448
1519
|
}
|
|
1520
|
+
function configuredSendTimeoutMs(value) {
|
|
1521
|
+
return value ?? DEFAULT_SEND_TIMEOUT_MS;
|
|
1522
|
+
}
|