@zlink-systems/framework 0.26.0 → 0.28.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/Actors/ZLinkActorClient.d.ts +1 -1
- package/dist/contracts/Channels/Calls.d.ts +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/Builders.d.ts +0 -1
- package/dist/contracts/Configuration/Configs.d.ts +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 -5
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -14
- 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 +2 -2
- package/dist/contracts/Streams/BoundSessionContracts.d.ts +1 -1
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -3
- package/dist/contracts/Streams/IZLinkSessionActor.d.ts +2 -2
- 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 +49 -153
- 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 +1 -0
- package/dist/runtime/actors/actor-request-deadline.js +6 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +2 -3
- 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 +7 -27
- 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 +3 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +51 -10
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +1 -2
- 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 +41 -34
- 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 +4 -3
- 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 +73 -59
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.d.ts +1 -1
- package/dist/runtime/channels/channel-envelope.js +51 -39
- package/dist/runtime/channels/channel-outbound-operations.d.ts +5 -2
- package/dist/runtime/channels/channel-outbound-operations.js +25 -42
- 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 +4 -4
- package/dist/runtime/channels/channel-runtime-manager.js +13 -10
- package/dist/runtime/channels/channel-socket-options.js +3 -12
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +240 -177
- package/dist/runtime/channels/channel-transports.d.ts +21 -31
- package/dist/runtime/channels/channel-transports.js +80 -62
- 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/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +1 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.js +2 -2
- package/dist/runtime/channels/source-spot-router.d.ts +1 -1
- package/dist/runtime/channels/source-spot-router.js +2 -4
- 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.d.ts +1 -1
- package/dist/runtime/channels/spot-node-route-transport.js +5 -5
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +1 -1
- package/dist/runtime/channels/spot-route-bridge-transport.js +2 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +2 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +11 -12
- 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 +79 -94
- 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 +11 -8
- package/dist/runtime/host/actor-packet-relay.js +54 -99
- 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 -171
- 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 +15 -28
- 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 +3 -12
- package/dist/runtime/host/spot-address-transport.js +78 -220
- 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 +309 -336
- 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/request-deadline.d.ts +3 -0
- package/dist/runtime/messaging/request-deadline.js +39 -0
- package/dist/runtime/messaging/submission-result.d.ts +4 -0
- package/dist/runtime/messaging/submission-result.js +56 -1
- 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 +7 -8
- package/dist/runtime/spots/spot-outbound.js +21 -23
- 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 +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.js +65 -41
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -2
- package/dist/runtime/streams/index.d.ts +16 -17
- package/dist/runtime/streams/index.js +22 -23
- package/dist/runtime/streams/managed-stream.d.ts +5 -2
- package/dist/runtime/streams/managed-stream.js +20 -13
- package/dist/runtime/streams/native-fallback-bound-session.js +14 -19
- 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 +6 -8
- package/dist/runtime/streams/session-calls.js +6 -22
- package/dist/runtime/streams/session-context.d.ts +10 -10
- package/dist/runtime/streams/session-context.js +25 -10
- 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/Actors/ZLinkActorClient.ts +1 -1
- package/src/contracts/Channels/Calls.ts +1 -1
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/Builders.ts +0 -1
- package/src/contracts/Configuration/Configs.ts +0 -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 -71
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -5
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -17
- 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 +2 -2
- package/src/contracts/Streams/BoundSessionContracts.ts +1 -1
- package/src/contracts/Streams/IZLinkSession.ts +2 -3
- package/src/contracts/Streams/IZLinkSessionActor.ts +2 -6
- 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 +85 -218
- 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 +4 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-routed-join-transport.ts +3 -5
- 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 +14 -37
- 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 +67 -10
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +0 -2
- 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 +44 -49
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +4 -3
- 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 +139 -102
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +74 -57
- package/src/runtime/channels/channel-outbound-operations.ts +40 -55
- 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 +12 -30
- package/src/runtime/channels/channel-socket-options.ts +8 -15
- package/src/runtime/channels/channel-socket-registry.ts +291 -196
- package/src/runtime/channels/channel-transports.ts +168 -145
- 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/local-spot-route-transport.ts +1 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +2 -6
- package/src/runtime/channels/source-spot-router.ts +2 -9
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +7 -9
- package/src/runtime/channels/spot-route-bridge-transport.ts +5 -12
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +11 -30
- 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 +127 -125
- 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 +63 -160
- 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 -320
- 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 +16 -57
- 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 +175 -356
- 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 +457 -482
- 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/request-deadline.ts +58 -0
- package/src/runtime/messaging/submission-result.ts +72 -2
- 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 +59 -47
- 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 +98 -66
- package/src/runtime/streams/bound-session-service.ts +22 -2
- package/src/runtime/streams/index.ts +78 -68
- package/src/runtime/streams/managed-stream.ts +32 -23
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -28
- 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 +11 -36
- package/src/runtime/streams/session-context.ts +60 -25
- 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,15 @@ 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
|
+
});
|
|
137
163
|
return dealer;
|
|
138
164
|
}
|
|
139
165
|
channelRouter(channelName) {
|
|
@@ -149,6 +175,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
149
175
|
throw new configuration_1.ZLinkConfigurationException(`Channel server '${channelName}' does not define a bind endpoint.`);
|
|
150
176
|
}
|
|
151
177
|
const router = this.adapter.createRouterSocket(this.context);
|
|
178
|
+
this.channelRouters.set(channelName, router);
|
|
152
179
|
this.registerReceiveFlowSocket(router);
|
|
153
180
|
router.setChannelName(channelName);
|
|
154
181
|
const identity = this.clientServerIdentities.get(channelName) ?? {
|
|
@@ -157,14 +184,14 @@ class ZLinkChannelSocketRegistry {
|
|
|
157
184
|
};
|
|
158
185
|
this.clientServerIdentities.set(channelName, identity);
|
|
159
186
|
router.setRoutingId(identity.serverRid);
|
|
160
|
-
const publicWeight = channel.server.weight ??
|
|
187
|
+
const publicWeight = channel.server.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
161
188
|
this.clientServerPublicWeights.set(channelName, publicWeight);
|
|
162
189
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
163
190
|
applySocketConfig(router, channel.server);
|
|
164
191
|
router.bind(channel.server.bind);
|
|
165
192
|
if (this.monitoringAdapter !== undefined) {
|
|
166
193
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
167
|
-
this.
|
|
194
|
+
this.ownedResources.add(monitor);
|
|
168
195
|
monitor.onEvent((event) => {
|
|
169
196
|
if (event.routingId === undefined)
|
|
170
197
|
return;
|
|
@@ -179,7 +206,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
179
206
|
this.clientServerAdmittedClients.get(channelName)?.delete(routingId);
|
|
180
207
|
});
|
|
181
208
|
}
|
|
182
|
-
this.channelRouters.set(channelName, router);
|
|
183
209
|
const endpoint = advertisedEndpoint(router.lastEndpoint ?? channel.server.bind, channel.server.advertiseHost);
|
|
184
210
|
this.recordListener('clientServer', channelName, endpoint);
|
|
185
211
|
if (!this.clientServerServerDescriptors.has(channelName)) {
|
|
@@ -219,7 +245,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
219
245
|
}
|
|
220
246
|
clientServerServerWeight(channelName) {
|
|
221
247
|
this.channelRouter(channelName);
|
|
222
|
-
return this.clientServerPublicWeights.get(channelName) ??
|
|
248
|
+
return this.clientServerPublicWeights.get(channelName) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
223
249
|
}
|
|
224
250
|
setClientServerServerWeight(channelName, weight) {
|
|
225
251
|
requirePublicWeight(weight);
|
|
@@ -240,49 +266,32 @@ class ZLinkChannelSocketRegistry {
|
|
|
240
266
|
throw new configuration_1.ZLinkConfigurationException(`Channel client '${channelName}' is not registered.`);
|
|
241
267
|
}
|
|
242
268
|
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
269
|
const connection = {
|
|
274
270
|
channelName,
|
|
275
271
|
endpoint,
|
|
276
272
|
dealer,
|
|
277
|
-
readablePoller,
|
|
278
|
-
monitor,
|
|
279
273
|
aliases: new Set([connectionId]),
|
|
280
274
|
callbacksByAlias: new Map([[connectionId, callbacks]]),
|
|
281
275
|
physicalConnectionId: Symbol(connectionId)
|
|
282
276
|
};
|
|
283
|
-
this.
|
|
284
|
-
|
|
277
|
+
this.ownedResources.add(dealer);
|
|
278
|
+
const created = [dealer];
|
|
285
279
|
try {
|
|
280
|
+
this.clientServerConnections.set(connectionId, connection);
|
|
281
|
+
this.registerReceiveFlowSocket(dealer);
|
|
282
|
+
dealer.setChannelName(channelName);
|
|
283
|
+
dealer.setRoutingId(`cs-client-${(0, node_crypto_1.randomUUID)()}`);
|
|
284
|
+
applySocketConfig(dealer, {
|
|
285
|
+
...client
|
|
286
|
+
});
|
|
287
|
+
connection.readablePoller = this.adapter.createReadablePoller(dealer);
|
|
288
|
+
created.push(connection.readablePoller);
|
|
289
|
+
this.ownedResources.add(connection.readablePoller);
|
|
290
|
+
const monitor = this.monitoringAdapter.openSocketMonitor(dealer);
|
|
291
|
+
connection.monitor = monitor;
|
|
292
|
+
created.push(monitor);
|
|
293
|
+
this.ownedResources.add(monitor);
|
|
294
|
+
this.ensureClientServerLivenessTimer();
|
|
286
295
|
monitor.onEvent((event) => {
|
|
287
296
|
if (![...connection.aliases].some((alias) => this.clientServerConnections.get(alias) === connection))
|
|
288
297
|
return;
|
|
@@ -312,26 +321,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
312
321
|
}
|
|
313
322
|
});
|
|
314
323
|
dealer.connect(endpoint);
|
|
324
|
+
return dealer;
|
|
315
325
|
}
|
|
316
326
|
catch (error) {
|
|
317
327
|
this.clientServerConnections.delete(connectionId);
|
|
318
|
-
this.
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
328
|
+
this.unregisterReceiveFlowSocket(dealer);
|
|
329
|
+
void Promise.allSettled(created.map(async (resource) => {
|
|
330
|
+
await resource.dispose();
|
|
331
|
+
this.ownedResources.delete(resource);
|
|
332
|
+
})).then((results) => {
|
|
333
|
+
for (const result of results)
|
|
334
|
+
if (result.status === 'rejected')
|
|
335
|
+
this.oneWayFailureSink?.(result.reason);
|
|
336
|
+
});
|
|
326
337
|
throw error;
|
|
327
338
|
}
|
|
328
|
-
return dealer;
|
|
329
339
|
}
|
|
330
340
|
async closeClientServerConnection(connectionId) {
|
|
331
341
|
const current = this.clientServerConnections.get(connectionId);
|
|
332
342
|
if (current === undefined)
|
|
333
343
|
return;
|
|
334
|
-
this.clientServerConnections.delete(connectionId);
|
|
335
344
|
current.aliases.delete(connectionId);
|
|
336
345
|
current.callbacksByAlias.delete(connectionId);
|
|
337
346
|
const ready = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -351,21 +360,34 @@ class ZLinkChannelSocketRegistry {
|
|
|
351
360
|
});
|
|
352
361
|
}
|
|
353
362
|
}
|
|
354
|
-
|
|
363
|
+
this.notifyClientServerTopology(current.channelName);
|
|
364
|
+
if (current.aliases.size > 0) {
|
|
365
|
+
this.clientServerConnections.delete(connectionId);
|
|
355
366
|
return;
|
|
367
|
+
}
|
|
356
368
|
await this.disposeClientServerPhysical(connectionId, current);
|
|
369
|
+
this.clientServerConnections.delete(connectionId);
|
|
357
370
|
}
|
|
358
371
|
async disposeClientServerPhysical(connectionId, current) {
|
|
359
372
|
try {
|
|
360
373
|
current.dealer.disconnect(current.endpoint);
|
|
361
374
|
}
|
|
362
375
|
catch {
|
|
363
|
-
//
|
|
376
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
364
377
|
}
|
|
365
|
-
this.ownedMonitors.delete(current.monitor);
|
|
366
378
|
this.unregisterReceiveFlowSocket(current.dealer);
|
|
367
|
-
current.readablePoller
|
|
368
|
-
|
|
379
|
+
if (current.readablePoller !== undefined) {
|
|
380
|
+
current.readablePoller.dispose();
|
|
381
|
+
this.ownedResources.delete(current.readablePoller);
|
|
382
|
+
current.readablePoller = undefined;
|
|
383
|
+
}
|
|
384
|
+
const results = await Promise.allSettled([
|
|
385
|
+
current.monitor?.dispose(),
|
|
386
|
+
(async () => {
|
|
387
|
+
await current.dealer.dispose();
|
|
388
|
+
this.ownedResources.delete(current.dealer);
|
|
389
|
+
})()
|
|
390
|
+
]);
|
|
369
391
|
const errors = results
|
|
370
392
|
.filter((result) => result.status === 'rejected')
|
|
371
393
|
.map((result) => result.reason);
|
|
@@ -374,6 +396,8 @@ class ZLinkChannelSocketRegistry {
|
|
|
374
396
|
if (errors.length > 1) {
|
|
375
397
|
throw new AggregateError(errors, `ClientServer connection '${connectionId}' cleanup failed.`);
|
|
376
398
|
}
|
|
399
|
+
if (current.monitor !== undefined)
|
|
400
|
+
this.ownedResources.delete(current.monitor);
|
|
377
401
|
}
|
|
378
402
|
admitClientServerConnection(descriptor, connectionId) {
|
|
379
403
|
const connection = this.clientServerConnections.get(connectionId);
|
|
@@ -383,6 +407,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
383
407
|
const admitted = this.clientServerDiscovery.admitClientServer(descriptor, connection.readyConnectionId);
|
|
384
408
|
if (admitted)
|
|
385
409
|
connection.admittedDescriptor = descriptor;
|
|
410
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
386
411
|
return admitted;
|
|
387
412
|
}
|
|
388
413
|
const duplicateId = [...this.clientServerReadyIdentities].find(([, identity]) => identity.channelName === descriptor.channelName &&
|
|
@@ -416,6 +441,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
416
441
|
connection.readyConnectionId = connectionId;
|
|
417
442
|
connection.admittedDescriptor = descriptor;
|
|
418
443
|
}
|
|
444
|
+
this.notifyClientServerTopology(descriptor.channelName);
|
|
419
445
|
return admitted;
|
|
420
446
|
}
|
|
421
447
|
removeClientServerReady(channelName, serverRoutingId, connectionId) {
|
|
@@ -430,6 +456,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
430
456
|
connection.outstandingProbeId = undefined;
|
|
431
457
|
}
|
|
432
458
|
}
|
|
459
|
+
this.notifyClientServerTopology(channelName);
|
|
433
460
|
return removed;
|
|
434
461
|
}
|
|
435
462
|
selectClientServerDealer(channelName) {
|
|
@@ -453,47 +480,52 @@ class ZLinkChannelSocketRegistry {
|
|
|
453
480
|
}
|
|
454
481
|
return undefined;
|
|
455
482
|
}
|
|
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();
|
|
483
|
+
/** Observes discovery changes until a server is ready or the runtime closes. */
|
|
484
|
+
async awaitClientDealerForOutbound(channelName, signal) {
|
|
485
|
+
(0, abort_1.throwIfAborted)(signal);
|
|
486
|
+
const select = () => {
|
|
486
487
|
const dealer = this.clientDealerForOutbound(channelName);
|
|
487
488
|
if (dealer !== undefined)
|
|
488
489
|
return dealer;
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
490
|
+
if (this.clientServerDiscovery.hasReadyClientServer(channelName)) {
|
|
491
|
+
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RouteNotConnected, `Channel '${channelName}' has no eligible ClientServer member.`);
|
|
492
|
+
}
|
|
493
|
+
return undefined;
|
|
494
|
+
};
|
|
495
|
+
const dealer = select();
|
|
496
|
+
if (dealer !== undefined)
|
|
497
|
+
return dealer;
|
|
498
|
+
return new Promise((resolve, reject) => {
|
|
499
|
+
const cleanup = () => {
|
|
500
|
+
unsubscribe();
|
|
501
|
+
signal?.removeEventListener('abort', abort);
|
|
502
|
+
};
|
|
503
|
+
const abort = () => {
|
|
504
|
+
cleanup();
|
|
505
|
+
reject((0, abort_1.createAbortError)());
|
|
506
|
+
};
|
|
507
|
+
const changed = (error) => {
|
|
508
|
+
try {
|
|
509
|
+
if (error !== undefined)
|
|
510
|
+
throw error;
|
|
511
|
+
const selected = select();
|
|
512
|
+
if (selected === undefined)
|
|
513
|
+
return;
|
|
514
|
+
cleanup();
|
|
515
|
+
resolve(selected);
|
|
516
|
+
}
|
|
517
|
+
catch (error) {
|
|
518
|
+
cleanup();
|
|
519
|
+
reject(error);
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
const unsubscribe = this.clientServerDiscovery.onClientServerChanged(changed);
|
|
523
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
524
|
+
// Registration and selection share one event-loop turn; recheck after subscribing.
|
|
525
|
+
changed();
|
|
526
|
+
if (signal?.aborted === true)
|
|
527
|
+
abort();
|
|
528
|
+
});
|
|
497
529
|
}
|
|
498
530
|
startManualClientServerConnections() {
|
|
499
531
|
for (const [channelName, channel] of this.registration.channels) {
|
|
@@ -522,26 +554,39 @@ class ZLinkChannelSocketRegistry {
|
|
|
522
554
|
}
|
|
523
555
|
}
|
|
524
556
|
clientServerMonitoringSource(channelName) {
|
|
525
|
-
|
|
526
|
-
|
|
557
|
+
const channel = this.registration.channels.get(channelName);
|
|
558
|
+
if (channel?.client === undefined && channel?.server === undefined) {
|
|
559
|
+
throw new configuration_1.ZLinkConfigurationException(`ClientServer channel '${channelName}' is not registered.`);
|
|
527
560
|
}
|
|
528
561
|
let disposed = false;
|
|
529
562
|
let handler;
|
|
563
|
+
const register = (next) => {
|
|
564
|
+
if (disposed)
|
|
565
|
+
return;
|
|
566
|
+
if (handler !== undefined) {
|
|
567
|
+
this.clientServerMonitorHandlers.get(channelName)?.delete(handler);
|
|
568
|
+
}
|
|
569
|
+
handler = next;
|
|
570
|
+
let handlers = this.clientServerMonitorHandlers.get(channelName);
|
|
571
|
+
if (handlers === undefined) {
|
|
572
|
+
handlers = new Set();
|
|
573
|
+
this.clientServerMonitorHandlers.set(channelName, handlers);
|
|
574
|
+
}
|
|
575
|
+
handlers.add(next);
|
|
576
|
+
};
|
|
530
577
|
return {
|
|
531
578
|
nativeInstance: {},
|
|
532
579
|
onEvent: (next) => {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
}
|
|
544
|
-
handlers.add(next);
|
|
580
|
+
register((event) => {
|
|
581
|
+
if (event !== undefined)
|
|
582
|
+
next(event);
|
|
583
|
+
});
|
|
584
|
+
},
|
|
585
|
+
onChange: (next) => {
|
|
586
|
+
register((event) => {
|
|
587
|
+
if (event === undefined)
|
|
588
|
+
next();
|
|
589
|
+
});
|
|
545
590
|
},
|
|
546
591
|
drain: () => 0,
|
|
547
592
|
dispose: async () => {
|
|
@@ -606,6 +651,11 @@ class ZLinkChannelSocketRegistry {
|
|
|
606
651
|
this.clientServerServerDescriptors.set(channelName, descriptor);
|
|
607
652
|
this.pushClientServerDescriptorUpdate(channelName, descriptor);
|
|
608
653
|
}
|
|
654
|
+
this.notifyClientServerTopology(channelName);
|
|
655
|
+
}
|
|
656
|
+
notifyClientServerTopology(channelName) {
|
|
657
|
+
for (const handler of this.clientServerMonitorHandlers.get(channelName) ?? [])
|
|
658
|
+
handler();
|
|
609
659
|
}
|
|
610
660
|
tryHandleClientServerControl(channelName, received, router) {
|
|
611
661
|
if (received.parts.length === 0)
|
|
@@ -632,17 +682,17 @@ class ZLinkChannelSocketRegistry {
|
|
|
632
682
|
else if (record.kind !== 'hello' ||
|
|
633
683
|
received.parts.length !== 1 ||
|
|
634
684
|
received.replyToken === null) {
|
|
635
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
685
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.ProtocolVersionUnsupported);
|
|
636
686
|
}
|
|
637
687
|
else {
|
|
638
688
|
const descriptor = this.clientServerServerDescriptors.get(channelName);
|
|
639
689
|
if (descriptor === undefined ||
|
|
640
690
|
record.hello.channelName !== channelName ||
|
|
641
691
|
record.hello.securityIdentity !== descriptor.securityIdentity) {
|
|
642
|
-
reply = (0, client_server_service_wire_1.encodeClientServerReject)(
|
|
692
|
+
reply = (0, client_server_service_wire_1.encodeClientServerReject)(client_server_service_wire_1.ClientServerRejectReason.AdmissionMismatch);
|
|
643
693
|
}
|
|
644
694
|
else {
|
|
645
|
-
const normalizedEffectiveMaxMessageBytes = Math.min(
|
|
695
|
+
const normalizedEffectiveMaxMessageBytes = Math.min((0, client_server_service_wire_1.normalizeClientServerMessageLimit)(router.maxMessageSize), record.hello.normalizedEffectiveMaxMessageBytes);
|
|
646
696
|
reply = (0, client_server_service_wire_1.encodeClientServerAdmit)(descriptor, normalizedEffectiveMaxMessageBytes);
|
|
647
697
|
this.admitClientServerServerPeer(channelName, String(received.routingId), normalizedEffectiveMaxMessageBytes);
|
|
648
698
|
}
|
|
@@ -716,23 +766,26 @@ class ZLinkChannelSocketRegistry {
|
|
|
716
766
|
throw new configuration_1.ZLinkConfigurationException(`Fanout subscriber '${channelName}' is not registered.`);
|
|
717
767
|
}
|
|
718
768
|
const subscriber = this.adapter.createSubscriberSocket(this.context);
|
|
719
|
-
subscriber.setChannelName(channelName);
|
|
720
|
-
setFanoutSubscriptions(subscriber, channel.subscriptions);
|
|
721
|
-
const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
|
|
722
769
|
const connection = {
|
|
723
770
|
channelName,
|
|
724
771
|
endpoint,
|
|
725
772
|
subscriber,
|
|
726
|
-
monitor,
|
|
727
773
|
callbacks,
|
|
728
774
|
physicalConnectionId: Symbol(connectionId),
|
|
729
775
|
transportReady: false,
|
|
730
776
|
ready: false
|
|
731
777
|
};
|
|
732
|
-
this.
|
|
733
|
-
|
|
734
|
-
this.ensureClientServerLivenessTimer();
|
|
778
|
+
this.ownedResources.add(subscriber);
|
|
779
|
+
const created = [subscriber];
|
|
735
780
|
try {
|
|
781
|
+
this.fanoutConnections.set(connectionId, connection);
|
|
782
|
+
subscriber.setChannelName(channelName);
|
|
783
|
+
setFanoutSubscriptions(subscriber, channel.subscriptions);
|
|
784
|
+
const monitor = this.monitoringAdapter.openSocketMonitor(subscriber);
|
|
785
|
+
connection.monitor = monitor;
|
|
786
|
+
created.push(monitor);
|
|
787
|
+
this.ownedResources.add(monitor);
|
|
788
|
+
this.ensureClientServerLivenessTimer();
|
|
736
789
|
monitor.onEvent((event) => {
|
|
737
790
|
if (this.fanoutConnections.get(connectionId) !== connection)
|
|
738
791
|
return;
|
|
@@ -755,30 +808,37 @@ class ZLinkChannelSocketRegistry {
|
|
|
755
808
|
}
|
|
756
809
|
});
|
|
757
810
|
subscriber.connect(endpoint);
|
|
811
|
+
return subscriber;
|
|
758
812
|
}
|
|
759
813
|
catch (error) {
|
|
760
814
|
this.fanoutConnections.delete(connectionId);
|
|
761
|
-
|
|
762
|
-
|
|
815
|
+
void Promise.allSettled(created.map(async (resource) => {
|
|
816
|
+
await resource.dispose();
|
|
817
|
+
this.ownedResources.delete(resource);
|
|
818
|
+
})).then((results) => {
|
|
819
|
+
for (const result of results)
|
|
820
|
+
if (result.status === 'rejected')
|
|
821
|
+
this.oneWayFailureSink?.(result.reason);
|
|
822
|
+
});
|
|
763
823
|
throw error;
|
|
764
824
|
}
|
|
765
|
-
return subscriber;
|
|
766
825
|
}
|
|
767
826
|
async closeFanoutSubscriberConnection(connectionId) {
|
|
768
827
|
const connection = this.fanoutConnections.get(connectionId);
|
|
769
828
|
if (connection === undefined)
|
|
770
829
|
return;
|
|
771
|
-
this.fanoutConnections.delete(connectionId);
|
|
772
830
|
try {
|
|
773
831
|
connection.subscriber.disconnect(connection.endpoint);
|
|
774
832
|
}
|
|
775
833
|
catch {
|
|
776
|
-
//
|
|
834
|
+
// The socket close below releases an endpoint that is already disconnected.
|
|
777
835
|
}
|
|
778
|
-
this.ownedMonitors.delete(connection.monitor);
|
|
779
836
|
const results = await Promise.allSettled([
|
|
780
|
-
connection.monitor
|
|
781
|
-
|
|
837
|
+
connection.monitor?.dispose(),
|
|
838
|
+
(async () => {
|
|
839
|
+
await connection.subscriber.dispose();
|
|
840
|
+
this.ownedResources.delete(connection.subscriber);
|
|
841
|
+
})()
|
|
782
842
|
]);
|
|
783
843
|
const errors = results
|
|
784
844
|
.filter((result) => result.status === 'rejected')
|
|
@@ -788,6 +848,9 @@ class ZLinkChannelSocketRegistry {
|
|
|
788
848
|
if (errors.length > 1) {
|
|
789
849
|
throw new AggregateError(errors, `Fanout connection '${connectionId}' cleanup failed.`);
|
|
790
850
|
}
|
|
851
|
+
this.fanoutConnections.delete(connectionId);
|
|
852
|
+
if (connection.monitor !== undefined)
|
|
853
|
+
this.ownedResources.delete(connection.monitor);
|
|
791
854
|
}
|
|
792
855
|
handleFanoutInbound(connectionId, topicMessage, source, nowMs = performance.now()) {
|
|
793
856
|
return this.handleFanoutInboundResult(connectionId, topicMessage, source, nowMs).consumed;
|
|
@@ -978,7 +1041,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
978
1041
|
}
|
|
979
1042
|
drainClientServerControl(connectionId, connection) {
|
|
980
1043
|
for (;;) {
|
|
981
|
-
if (!connection.readablePoller.wait(0))
|
|
1044
|
+
if (connection.readablePoller === undefined || !connection.readablePoller.wait(0))
|
|
982
1045
|
return;
|
|
983
1046
|
const received = connection.dealer.recv(1);
|
|
984
1047
|
if (received === undefined) {
|
|
@@ -1082,12 +1145,13 @@ class ZLinkChannelSocketRegistry {
|
|
|
1082
1145
|
ensureClientServerLivenessTimer() {
|
|
1083
1146
|
if (this.clientServerLivenessTimer !== undefined)
|
|
1084
1147
|
return;
|
|
1085
|
-
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(),
|
|
1148
|
+
this.clientServerLivenessTimer = setInterval(() => this.tickClientServerLiveness(), CLIENT_SERVER_LIVENESS_TICK_MS);
|
|
1086
1149
|
this.clientServerLivenessTimer.unref();
|
|
1087
1150
|
}
|
|
1088
1151
|
drainSocketMonitors() {
|
|
1089
|
-
for (const monitor of this.
|
|
1090
|
-
monitor
|
|
1152
|
+
for (const monitor of this.ownedResources)
|
|
1153
|
+
if ('drain' in monitor)
|
|
1154
|
+
monitor.drain();
|
|
1091
1155
|
}
|
|
1092
1156
|
removeReadyConnection(connectionId) {
|
|
1093
1157
|
const identity = this.clientServerReadyIdentities.get(connectionId);
|
|
@@ -1104,6 +1168,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1104
1168
|
connection.nextProbeAt = undefined;
|
|
1105
1169
|
connection.outstandingProbeId = undefined;
|
|
1106
1170
|
}
|
|
1171
|
+
this.notifyClientServerTopology(identity.channelName);
|
|
1107
1172
|
}
|
|
1108
1173
|
requestClientServerLiveness(connectionId, connection, probeId) {
|
|
1109
1174
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerLivenessProbe)(probeId));
|
|
@@ -1197,7 +1262,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1197
1262
|
}
|
|
1198
1263
|
allocateClientServerProbeId() {
|
|
1199
1264
|
const result = this.nextClientServerProbeId;
|
|
1200
|
-
this.nextClientServerProbeId = result ===
|
|
1265
|
+
this.nextClientServerProbeId = result === stream_wire_1.UINT64_MAX ? 1n : result + 1n;
|
|
1201
1266
|
return result;
|
|
1202
1267
|
}
|
|
1203
1268
|
publisher(channelName) {
|
|
@@ -1213,10 +1278,10 @@ class ZLinkChannelSocketRegistry {
|
|
|
1213
1278
|
throw new configuration_1.ZLinkConfigurationException(`Channel publisher '${channelName}' does not define a bind endpoint.`);
|
|
1214
1279
|
}
|
|
1215
1280
|
const publisher = this.adapter.createPublisherSocket(this.context);
|
|
1281
|
+
this.publishers.set(channelName, publisher);
|
|
1216
1282
|
publisher.setChannelName(channelName);
|
|
1217
1283
|
applyFanoutPublisherSocketOptions(publisher, channel);
|
|
1218
1284
|
publisher.bind(channel.publisher.bind);
|
|
1219
|
-
this.publishers.set(channelName, publisher);
|
|
1220
1285
|
const endpoint = (0, configuration_1.buildAdvertisedEndpoint)(publisher.lastEndpoint ?? channel.publisher.bind, channel.publisher.advertiseHost);
|
|
1221
1286
|
if (endpoint !== undefined && endpoint.length > 0) {
|
|
1222
1287
|
this.recordListener('fanout', channelName, endpoint);
|
|
@@ -1235,6 +1300,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1235
1300
|
throw new configuration_1.ZLinkConfigurationException(`Route channel '${routerChannelId}' is not registered.`);
|
|
1236
1301
|
}
|
|
1237
1302
|
const router = this.adapter.createRouterSocket(this.context);
|
|
1303
|
+
this.routeRouters.set(routerChannelId, router);
|
|
1238
1304
|
this.registerReceiveFlowSocket(router);
|
|
1239
1305
|
router.setChannelName(routerChannelId);
|
|
1240
1306
|
if ((routeChannel.manualConnections?.length ?? 0) > 0 &&
|
|
@@ -1242,7 +1308,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1242
1308
|
router.setProbe(true);
|
|
1243
1309
|
}
|
|
1244
1310
|
router.setRoutingId(routeChannel.routingId ?? `${routeChannel.routingIdPrefix ?? routerChannelId}-${(0, node_crypto_1.randomUUID)()}`);
|
|
1245
|
-
const publicWeight = routeChannel.weight ??
|
|
1311
|
+
const publicWeight = routeChannel.weight ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1246
1312
|
this.routeMeshPublicWeights.set(routerChannelId, publicWeight);
|
|
1247
1313
|
router.peerWeight = rawAvailabilityWeight(publicWeight);
|
|
1248
1314
|
applySocketConfig(router, routeChannel);
|
|
@@ -1256,7 +1322,6 @@ class ZLinkChannelSocketRegistry {
|
|
|
1256
1322
|
if (routeChannel.bind !== undefined && routeChannel.bind.trim().length > 0) {
|
|
1257
1323
|
router.bind(routeChannel.bind);
|
|
1258
1324
|
}
|
|
1259
|
-
this.routeRouters.set(routerChannelId, router);
|
|
1260
1325
|
return router;
|
|
1261
1326
|
}
|
|
1262
1327
|
routeMeshSocket(routerChannelId) {
|
|
@@ -1264,7 +1329,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1264
1329
|
}
|
|
1265
1330
|
routeMeshWeight(routerChannelId) {
|
|
1266
1331
|
this.routeRouter(routerChannelId);
|
|
1267
|
-
return this.routeMeshPublicWeights.get(routerChannelId) ??
|
|
1332
|
+
return this.routeMeshPublicWeights.get(routerChannelId) ?? RegistrationBuilderPolicy_1.ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
1268
1333
|
}
|
|
1269
1334
|
setRouteMeshWeight(routerChannelId, weight) {
|
|
1270
1335
|
requirePublicWeight(weight);
|
|
@@ -1286,7 +1351,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1286
1351
|
return;
|
|
1287
1352
|
}
|
|
1288
1353
|
const monitor = this.monitoringAdapter.openSocketMonitor(socket);
|
|
1289
|
-
this.
|
|
1354
|
+
this.ownedResources.add(monitor);
|
|
1290
1355
|
monitor.onEvent((event) => {
|
|
1291
1356
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.Disconnected &&
|
|
1292
1357
|
event.remoteAddr.length > 0) {
|
|
@@ -1299,7 +1364,7 @@ class ZLinkChannelSocketRegistry {
|
|
|
1299
1364
|
return;
|
|
1300
1365
|
}
|
|
1301
1366
|
const monitor = this.monitoringAdapter.openSocketMonitor(router);
|
|
1302
|
-
this.
|
|
1367
|
+
this.ownedResources.add(monitor);
|
|
1303
1368
|
monitor.onEvent((event) => {
|
|
1304
1369
|
const routingId = event.routingId === undefined ? undefined : String(event.routingId);
|
|
1305
1370
|
if (event.nativeEvent === internal_event_contracts_1.ZLinkSocketNativeEventType.ConnectionReady &&
|
|
@@ -1328,7 +1393,7 @@ async function requestClientServerAdmission(dealer, channelName, securityIdentit
|
|
|
1328
1393
|
const message = runtime_message_1.ZLinkBufferMessage.from((0, client_server_service_wire_1.encodeClientServerHello)({
|
|
1329
1394
|
channelName,
|
|
1330
1395
|
securityIdentity,
|
|
1331
|
-
normalizedEffectiveMaxMessageBytes:
|
|
1396
|
+
normalizedEffectiveMaxMessageBytes: (0, client_server_service_wire_1.normalizeClientServerMessageLimit)(dealer.maxMessageSize)
|
|
1332
1397
|
}));
|
|
1333
1398
|
try {
|
|
1334
1399
|
const parts = await dealer.request(message, timeoutMs);
|
|
@@ -1391,13 +1456,14 @@ function setFanoutSubscriptions(subscriber, applicationTopics) {
|
|
|
1391
1456
|
}
|
|
1392
1457
|
function deriveRoutingId(baseRoutingId, suffix) {
|
|
1393
1458
|
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
|
|
1459
|
+
if (Buffer.byteLength(derived, 'utf8') > CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES) {
|
|
1460
|
+
throw new configuration_1.ZLinkConfigurationException(`Derived routing id with suffix '${suffix}' exceeds the ${CoreTypes_1.ZLINK_MAX_ROUTING_ID_BYTES} byte limit.`);
|
|
1396
1461
|
}
|
|
1397
1462
|
return derived;
|
|
1398
1463
|
}
|
|
1399
1464
|
function applyFanoutPublisherSocketOptions(publisher, channel) {
|
|
1400
1465
|
publisher.noDrop = channel.noDrop ?? false;
|
|
1466
|
+
publisher.sendTimeoutMs = configuredSendTimeoutMs(channel.publisher?.sendTimeoutMs);
|
|
1401
1467
|
}
|
|
1402
1468
|
function fanoutDiscoveryConnectionId(connectionId) {
|
|
1403
1469
|
return `fanout:${connectionId.replaceAll('\0', '/')}`;
|
|
@@ -1416,12 +1482,9 @@ function advertisedEndpoint(boundEndpoint, advertiseHost) {
|
|
|
1416
1482
|
}
|
|
1417
1483
|
return result;
|
|
1418
1484
|
}
|
|
1419
|
-
function normalizedMessageLimit(value) {
|
|
1420
|
-
return Number.isSafeInteger(value) && value > 0 ? Math.min(value, 0xffff_ffff) : 0x7fff_ffff;
|
|
1421
|
-
}
|
|
1422
1485
|
function requirePublicWeight(weight) {
|
|
1423
|
-
if (!
|
|
1424
|
-
throw new configuration_1.ZLinkConfigurationException(
|
|
1486
|
+
if (!(0, RegistrationBuilderPolicy_1.isValidPublicWeight)(weight)) {
|
|
1487
|
+
throw new configuration_1.ZLinkConfigurationException(`Weight must be an integer in 0..${RegistrationBuilderPolicy_1.ZLINK_MAX_PUBLIC_WEIGHT}.`);
|
|
1425
1488
|
}
|
|
1426
1489
|
}
|
|
1427
1490
|
function rawAvailabilityWeight(weight) {
|
|
@@ -1439,10 +1502,10 @@ function applySocketConfig(socket, config) {
|
|
|
1439
1502
|
if (config.receiveTimeoutMs !== undefined) {
|
|
1440
1503
|
socket.receiveTimeoutMs = config.receiveTimeoutMs;
|
|
1441
1504
|
}
|
|
1442
|
-
if (config.sendTimeoutMs !== undefined) {
|
|
1443
|
-
socket.sendTimeoutMs = config.sendTimeoutMs;
|
|
1444
|
-
}
|
|
1445
1505
|
if (config.maxMessageSize !== undefined) {
|
|
1446
1506
|
socket.maxMessageSize = config.maxMessageSize;
|
|
1447
1507
|
}
|
|
1448
1508
|
}
|
|
1509
|
+
function configuredSendTimeoutMs(value) {
|
|
1510
|
+
return value ?? DEFAULT_SEND_TIMEOUT_MS;
|
|
1511
|
+
}
|