@zlink-systems/framework 0.21.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkMessage.js +5 -5
- package/dist/contracts/Configuration/CodecContentType.js +5 -7
- package/dist/contracts/Configuration/DiagnosticsValidation.js +1 -6
- package/dist/contracts/Configuration/EndpointNotation.js +4 -8
- package/dist/contracts/Configuration/Registration.js +14 -11
- package/dist/contracts/Configuration/RegistrationBuilders.js +32 -25
- package/dist/contracts/Configuration/RegistrationNormalizers.js +25 -26
- package/dist/contracts/Configuration/RegistrationValidators.js +36 -38
- package/dist/contracts/Configuration/SendTimeoutValidation.js +4 -4
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +7 -7
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -0
- package/dist/contracts/Handlers/JsonContract.js +23 -11
- package/dist/contracts/Spots/SpotKind.js +16 -8
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -1
- package/dist/location-store-integration.js +16 -16
- package/dist/nest-integration.js +17 -11
- package/dist/runtime/abort.js +9 -5
- package/dist/runtime/actors/actor-authority-payload-codec.js +12 -16
- package/dist/runtime/actors/actor-authority-publication.js +18 -17
- package/dist/runtime/actors/actor-client.js +83 -63
- package/dist/runtime/actors/actor-context.js +28 -22
- package/dist/runtime/actors/actor-creation.js +4 -3
- package/dist/runtime/actors/actor-handoff.js +89 -92
- package/dist/runtime/actors/actor-join-deferred-scope.d.ts +0 -1
- package/dist/runtime/actors/actor-join-deferred-scope.js +0 -18
- package/dist/runtime/actors/actor-local-native-join.js +18 -19
- package/dist/runtime/actors/actor-mailbox.js +1 -1
- package/dist/runtime/actors/actor-message-follow-context.js +24 -21
- package/dist/runtime/actors/actor-packet-relay-wire.js +1 -3
- package/dist/runtime/actors/actor-remote-joiner.js +20 -17
- package/dist/runtime/actors/actor-remote-wire.js +6 -7
- package/dist/runtime/actors/actor-runtime-state.js +87 -81
- package/dist/runtime/actors/actor-transfer-registry.js +3 -5
- package/dist/runtime/actors/bound-session-wire.js +14 -9
- package/dist/runtime/actors/deferred-join-accepted-journal.js +160 -130
- package/dist/runtime/actors/index.js +2 -5
- package/dist/runtime/actors/post-commit-actor-binder.js +3 -6
- package/dist/runtime/actors/post-commit-actor-location.js +1 -1
- package/dist/runtime/actors/spot-actor-dispatch.js +5 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +4 -4
- package/dist/runtime/admission.js +2 -6
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +2 -6
- package/dist/runtime/application-jobs/receive-flow-controller.js +11 -12
- package/dist/runtime/backend/contracts/index.d.ts +1 -0
- package/dist/runtime/backend/mesh-completion-table.js +1 -3
- package/dist/runtime/backend/mesh-dispatch-pump.js +12 -16
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +1 -3
- package/dist/runtime/backend/node/node-backend-adapter-support.js +26 -17
- package/dist/runtime/backend/node/node-mesh-backend-adapter.js +4 -3
- package/dist/runtime/backend/node/node-raw-binding-port.js +7 -6
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +3 -0
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +134 -118
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +12 -13
- package/dist/runtime/backend/runtime-message.js +3 -3
- package/dist/runtime/backend/runtime-values.d.ts +2 -2
- package/dist/runtime/backend/runtime-values.js +4 -5
- package/dist/runtime/channels/channel-clients.js +27 -24
- package/dist/runtime/channels/channel-dispatch-pipeline.js +12 -20
- package/dist/runtime/channels/channel-dispatch-services.js +7 -4
- package/dist/runtime/channels/channel-dispatchers.js +9 -9
- package/dist/runtime/channels/channel-envelope-inspection.js +16 -13
- package/dist/runtime/channels/channel-envelope.js +83 -47
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-receive-loops.js +20 -22
- package/dist/runtime/channels/channel-receive-task-tracker.js +1 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +61 -56
- package/dist/runtime/channels/channel-runtime-manager.js +18 -9
- package/dist/runtime/channels/channel-socket-registry.js +126 -123
- package/dist/runtime/channels/channel-transports.js +46 -42
- package/dist/runtime/channels/client-server-location-runtime.js +32 -40
- package/dist/runtime/channels/client-server-service-wire.js +29 -22
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -0
- package/dist/runtime/channels/dispatch-error-reporter.js +9 -39
- package/dist/runtime/channels/fanout-location-runtime.js +34 -47
- package/dist/runtime/channels/fanout-service-wire.js +3 -5
- package/dist/runtime/channels/local-spot-route-transport.js +7 -1
- package/dist/runtime/channels/route-member-snapshot.js +3 -3
- package/dist/runtime/channels/source-spot-router.js +6 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +5 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +2 -2
- package/dist/runtime/channels/spot-route-target-resolver.js +6 -6
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +6 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +55 -0
- package/dist/runtime/diagnostics/flow-context.d.ts +2 -1
- package/dist/runtime/diagnostics/flow-context.js +2 -2
- package/dist/runtime/diagnostics/index.js +38 -10
- package/dist/runtime/diagnostics/message-flow.js +58 -42
- package/dist/runtime/diagnostics/runtime-metrics.js +18 -9
- package/dist/runtime/diagnostics/runtime-observation-queue.js +8 -10
- package/dist/runtime/diagnostics/topology-runtime-projections.js +17 -10
- package/dist/runtime/execution/index.js +7 -6
- package/dist/runtime/execution/serial-execution-queue.js +12 -18
- package/dist/runtime/execution/state-lane.js +2 -2
- package/dist/runtime/foundation/actor-join-recovery-codec.js +31 -27
- package/dist/runtime/foundation/event-loop-resources.js +4 -4
- package/dist/runtime/foundation/message-follow-suppression-registry.js +4 -4
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +4 -2
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +169 -144
- package/dist/runtime/foundation/route-mesh-connection-policy.js +4 -4
- package/dist/runtime/foundation/runtime-state-projections.js +22 -11
- package/dist/runtime/foundation/service-authority-payload-codec.js +13 -15
- package/dist/runtime/foundation/service-discovery-registry.js +35 -33
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +20 -22
- package/dist/runtime/foundation/service-liveness-registry.js +16 -12
- package/dist/runtime/foundation/service-maintenance-runtime.js +2 -4
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +24 -24
- package/dist/runtime/foundation/service-relocation-object-owner.js +6 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +137 -94
- package/dist/runtime/foundation/service-runtime-contracts.js +5 -5
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +1 -0
- package/dist/runtime/foundation/service-stateful-registry.js +24 -23
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +4 -0
- package/dist/runtime/foundation/service-stateful-runtime.js +461 -439
- package/dist/runtime/foundation/service-stateful-wire-codec.js +95 -98
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -0
- package/dist/runtime/foundation/service-topology-registry.js +105 -96
- package/dist/runtime/foundation/service-weighted-selection.js +6 -11
- package/dist/runtime/foundation/service-wire-binary-primitives.js +5 -6
- package/dist/runtime/foundation/service-wire-m6a-codec.js +46 -35
- package/dist/runtime/framework-errors-internal.js +7 -10
- package/dist/runtime/handlers/handler-instance-scope.js +4 -5
- package/dist/runtime/handlers/index.js +3 -1
- package/dist/runtime/host/actor-packet-relay.js +74 -70
- package/dist/runtime/host/actor-placement-coordinator.js +29 -31
- package/dist/runtime/host/actor-runtime-options-factory.js +12 -14
- package/dist/runtime/host/actor-transfer-authority-runtime.js +7 -9
- package/dist/runtime/host/actor-transfer-runtime.js +176 -153
- package/dist/runtime/host/application-job-queue.js +18 -22
- package/dist/runtime/host/bound-session-relay.js +3 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +31 -14
- package/dist/runtime/host/host-capacity-status.js +8 -4
- package/dist/runtime/host/index.js +245 -228
- package/dist/runtime/host/instance-activation-authority.js +93 -96
- package/dist/runtime/host/location-runtime-owner.js +16 -14
- package/dist/runtime/host/mesh-router-resolver.js +11 -13
- package/dist/runtime/host/relocation-direct-transfer.js +10 -9
- package/dist/runtime/host/remote-actor-join-receiver.js +20 -15
- package/dist/runtime/host/remote-actor-packet-target-store.js +18 -22
- package/dist/runtime/host/remote-bound-session-relay.js +97 -73
- package/dist/runtime/host/route-mesh-runtime.js +64 -69
- package/dist/runtime/host/runtime-shutdown.js +1 -2
- package/dist/runtime/host/service-relocation-host-runtime.js +586 -511
- package/dist/runtime/host/spot-address-transport.js +69 -71
- package/dist/runtime/host/spot-runtime-options-factory.js +30 -29
- package/dist/runtime/host/stateful-authority-route-runtime.js +65 -68
- package/dist/runtime/host/user-spot-creation-coordinator.js +61 -67
- package/dist/runtime/locations/actor-location-claims.js +26 -20
- package/dist/runtime/locations/aggregate-inventory-store.js +72 -75
- package/dist/runtime/locations/authority-key-codec.js +7 -7
- package/dist/runtime/locations/auto-connect-loop.js +3 -3
- package/dist/runtime/locations/auto-connect-planner.js +25 -19
- package/dist/runtime/locations/auto-connect-reconciler.js +51 -31
- package/dist/runtime/locations/in-memory-authority-store.js +128 -118
- package/dist/runtime/locations/in-memory-location-store.js +195 -168
- package/dist/runtime/locations/in-memory-provider-location-store.js +8 -10
- package/dist/runtime/locations/key-codec.js +1 -1
- package/dist/runtime/locations/lease-tracker.js +23 -21
- package/dist/runtime/locations/lifecycle.js +4 -5
- package/dist/runtime/locations/location-store-repository.js +368 -324
- package/dist/runtime/locations/opaque-record-key.js +2 -2
- package/dist/runtime/locations/resolvers.js +73 -82
- package/dist/runtime/locations/runtime.js +68 -63
- package/dist/runtime/locations/spot-location-claims.js +39 -35
- package/dist/runtime/messaging/framework-json-v1.js +7 -7
- package/dist/runtime/messaging/packet-name.js +7 -6
- package/dist/runtime/messaging/payload-codec.js +21 -18
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +30 -2
- package/dist/runtime/protocol/service_wire_codec.generated.js +1671 -234
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +20 -18
- package/dist/runtime/routing-id.js +3 -5
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +35 -31
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.js +1 -2
- package/dist/runtime/spots/index.js +209 -220
- package/dist/runtime/spots/spot-activation-registry.js +15 -14
- package/dist/runtime/spots/spot-activation-state.js +17 -15
- package/dist/runtime/spots/spot-activation.js +33 -16
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +18 -15
- package/dist/runtime/spots/spot-actor-membership.js +1 -3
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +2 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +29 -21
- package/dist/runtime/spots/spot-actor-packet-drain.js +14 -10
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +10 -6
- package/dist/runtime/spots/spot-closing.js +3 -7
- package/dist/runtime/spots/spot-context.js +2 -2
- package/dist/runtime/spots/spot-entry-activation.js +13 -14
- package/dist/runtime/spots/spot-handle.js +6 -3
- package/dist/runtime/spots/spot-handler-registry.js +12 -12
- package/dist/runtime/spots/spot-manager-public.js +5 -6
- package/dist/runtime/spots/spot-native-actor-join-admission.js +4 -3
- package/dist/runtime/spots/spot-node-autoconnect.js +15 -18
- package/dist/runtime/spots/spot-node-runtime-manager.js +79 -86
- package/dist/runtime/spots/spot-outbound.js +10 -14
- package/dist/runtime/spots/spot-remote-codec.js +22 -26
- package/dist/runtime/spots/spot-remote-route-codec.js +5 -7
- package/dist/runtime/spots/spot-route-packet-dispatch.js +17 -15
- package/dist/runtime/spots/spot-route-replies.js +4 -6
- package/dist/runtime/spots/spot-routed-actor-admission.js +9 -7
- package/dist/runtime/spots/spot-routed-bound-session-dispatch.js +2 -3
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +5 -5
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +14 -10
- package/dist/runtime/spots/spot-serial-executor.js +5 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +4 -6
- package/dist/runtime/spots/spot-subscription-dispatch.js +6 -6
- package/dist/runtime/spots/spot-timer.js +26 -30
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +21 -8
- package/dist/runtime/streams/actor-session-binding-registry.js +168 -148
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +1 -0
- package/dist/runtime/streams/actor-session-lifecycle-coordinator.js +3 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +20 -17
- package/dist/runtime/streams/bound-session-response-target.js +8 -1
- package/dist/runtime/streams/bound-session-service.d.ts +1 -0
- package/dist/runtime/streams/bound-session-service.js +14 -12
- package/dist/runtime/streams/index.js +28 -20
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +52 -31
- package/dist/runtime/streams/native-fallback-bound-session.js +21 -17
- package/dist/runtime/streams/protocol.d.ts +5 -1
- package/dist/runtime/streams/protocol.js +68 -20
- package/dist/runtime/streams/session-actor-coordinator.js +37 -41
- package/dist/runtime/streams/session-context.d.ts +9 -2
- package/dist/runtime/streams/session-context.js +50 -32
- package/dist/runtime/streams/session-local-actors.d.ts +3 -1
- package/dist/runtime/streams/session-local-actors.js +17 -2
- package/dist/runtime/streams/session-provider.js +2 -2
- package/dist/runtime/streams/session-serial-executor.js +1 -2
- package/dist/runtime/streams/stream-frame-factory.d.ts +1 -1
- package/dist/runtime/streams/stream-frame-factory.js +14 -7
- package/dist/runtime/streams/stream-session-runtime.js +112 -78
- package/dist/runtime/workers/index.js +15 -4
- package/package.json +3 -3
- package/src/contracts/Channels/RouteCalls.ts +6 -1
- package/src/contracts/Common/ZLinkMessage.ts +5 -5
- package/src/contracts/Common/ZLinkMessageMetadata.ts +4 -3
- package/src/contracts/Configuration/Builders.ts +14 -14
- package/src/contracts/Configuration/CodecContentType.ts +8 -10
- package/src/contracts/Configuration/DiagnosticsValidation.ts +1 -6
- package/src/contracts/Configuration/EndpointNotation.ts +11 -11
- package/src/contracts/Configuration/ObjectRoles.ts +1 -3
- package/src/contracts/Configuration/Registration.ts +46 -17
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +10 -8
- package/src/contracts/Configuration/RegistrationBuilders.ts +107 -96
- package/src/contracts/Configuration/RegistrationCodecRegistry.ts +9 -3
- package/src/contracts/Configuration/RegistrationNormalizers.ts +116 -84
- package/src/contracts/Configuration/RegistrationTypes.ts +21 -25
- package/src/contracts/Configuration/RegistrationValidators.ts +122 -73
- package/src/contracts/Configuration/RouteChannelInternalState.ts +1 -4
- package/src/contracts/Configuration/RuntimeEndpointConnections.ts +4 -1
- package/src/contracts/Configuration/SendTimeoutValidation.ts +6 -4
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +8 -13
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -6
- package/src/contracts/Errors/index.ts +1 -4
- package/src/contracts/Handlers/Attributes.ts +15 -9
- package/src/contracts/Handlers/IZLinkChannelHandlers.ts +24 -4
- package/src/contracts/Handlers/JsonContract.ts +53 -19
- package/src/contracts/Locations/ActorTransfer.ts +1 -5
- package/src/contracts/Locations/Authority.ts +4 -11
- package/src/contracts/Locations/Keys.ts +6 -1
- package/src/contracts/Locations/Options.ts +3 -2
- package/src/contracts/Locations/RelocationStore.ts +1 -4
- package/src/contracts/Locations/Resolvers.ts +5 -5
- package/src/contracts/Locations/RuntimeQuery.ts +6 -2
- package/src/contracts/Locations/Stores.ts +1 -2
- package/src/contracts/Locations/index.ts +2 -8
- package/src/contracts/RouteMesh/Contracts.ts +1 -7
- package/src/contracts/RouteMesh/RuntimeTopology.ts +1 -4
- package/src/contracts/Spots/Contracts.ts +2 -8
- package/src/contracts/Spots/SpotKind.ts +16 -8
- package/src/contracts/Spots/ZLinkSpot.ts +8 -11
- package/src/contracts/Streams/IZLinkSession.ts +2 -2
- package/src/contracts/Streams/IZLinkSessionActor.ts +5 -1
- package/src/contracts/Streams/IZLinkSessionPacketHandler.ts +5 -1
- package/src/internal.ts +5 -4
- package/src/location-store-integration.ts +24 -16
- package/src/nest-integration.ts +40 -25
- package/src/runtime/abort.ts +10 -4
- package/src/runtime/actors/actor-authority-payload-codec.ts +20 -29
- package/src/runtime/actors/actor-authority-publication.ts +92 -77
- package/src/runtime/actors/actor-client.ts +162 -133
- package/src/runtime/actors/actor-context.ts +142 -134
- package/src/runtime/actors/actor-creation.ts +47 -44
- package/src/runtime/actors/actor-execution-context.ts +6 -4
- package/src/runtime/actors/actor-handoff.ts +269 -293
- package/src/runtime/actors/actor-join-deferred-scope.ts +1 -32
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +5 -8
- package/src/runtime/actors/actor-local-native-join.ts +131 -159
- package/src/runtime/actors/actor-mailbox.ts +16 -19
- package/src/runtime/actors/actor-message-follow-context.ts +46 -36
- package/src/runtime/actors/actor-packet-relay-wire.ts +32 -21
- package/src/runtime/actors/actor-remote-joiner.ts +50 -54
- package/src/runtime/actors/actor-remote-wire.ts +9 -13
- package/src/runtime/actors/actor-routed-join-transport.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -5
- package/src/runtime/actors/actor-runtime-state.ts +127 -124
- package/src/runtime/actors/actor-transfer-registry.ts +9 -14
- package/src/runtime/actors/actor-transport-delivery-gate.ts +4 -6
- package/src/runtime/actors/bound-session-wire.ts +37 -17
- package/src/runtime/actors/deferred-join-accepted-journal.ts +353 -326
- package/src/runtime/actors/index.ts +43 -86
- package/src/runtime/actors/post-commit-actor-binder.ts +10 -10
- package/src/runtime/actors/post-commit-actor-location.ts +30 -23
- package/src/runtime/actors/spot-actor-dispatch.ts +78 -53
- package/src/runtime/actors/transferred-actor-rollback.ts +18 -13
- package/src/runtime/admission.ts +9 -9
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +5 -15
- package/src/runtime/application-jobs/application-job-queue-handler-start-gate.ts +3 -2
- package/src/runtime/application-jobs/receive-flow-controller.ts +17 -14
- package/src/runtime/backend/contracts/index.ts +77 -52
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -14
- package/src/runtime/backend/mesh-completion-table.ts +6 -9
- package/src/runtime/backend/mesh-dispatch-pump.ts +38 -30
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +23 -21
- package/src/runtime/backend/node/node-backend-adapter-support.ts +36 -22
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +59 -58
- package/src/runtime/backend/node/node-event-loop-poller.ts +2 -10
- package/src/runtime/backend/node/node-mesh-backend-adapter.ts +12 -5
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +4 -3
- package/src/runtime/backend/node/node-raw-binding-port.ts +29 -29
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +370 -390
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +101 -54
- package/src/runtime/backend/runtime-message.ts +5 -3
- package/src/runtime/backend/runtime-values.ts +10 -7
- package/src/runtime/channels/channel-autoconnect.ts +1 -4
- package/src/runtime/channels/channel-clients.ts +93 -73
- package/src/runtime/channels/channel-dispatch-pipeline.ts +44 -44
- package/src/runtime/channels/channel-dispatch-services.ts +51 -49
- package/src/runtime/channels/channel-dispatchers.ts +152 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +20 -16
- package/src/runtime/channels/channel-envelope.ts +256 -150
- package/src/runtime/channels/channel-multipart.ts +13 -5
- package/src/runtime/channels/channel-outbound-operations.ts +37 -41
- package/src/runtime/channels/channel-receive-loops.ts +102 -98
- package/src/runtime/channels/channel-receive-task-tracker.ts +1 -1
- package/src/runtime/channels/channel-runtime-lifecycle.ts +248 -190
- package/src/runtime/channels/channel-runtime-manager.ts +63 -37
- package/src/runtime/channels/channel-socket-options.ts +3 -10
- package/src/runtime/channels/channel-socket-registry.ts +331 -273
- package/src/runtime/channels/channel-transports.ts +218 -206
- package/src/runtime/channels/client-server-location-runtime.ts +116 -100
- package/src/runtime/channels/client-server-service-wire.ts +37 -36
- package/src/runtime/channels/dispatch-error-reporter.ts +12 -47
- package/src/runtime/channels/fanout-location-runtime.ts +91 -94
- package/src/runtime/channels/fanout-service-wire.ts +5 -12
- package/src/runtime/channels/handler-filter-scope.ts +1 -4
- package/src/runtime/channels/index.ts +1 -4
- package/src/runtime/channels/local-spot-route-transport.ts +20 -5
- package/src/runtime/channels/route-member-snapshot.ts +11 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +1 -7
- package/src/runtime/channels/source-spot-router.ts +26 -22
- package/src/runtime/channels/spot-direct-envelope.ts +10 -8
- package/src/runtime/channels/spot-node-route-transport.ts +13 -16
- package/src/runtime/channels/spot-route-bridge-transport.ts +26 -9
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +40 -13
- package/src/runtime/channels/spot-route-target-resolver.ts +18 -9
- package/src/runtime/codecs/index.ts +3 -2
- package/src/runtime/diagnostics/dispatch-error-details.ts +62 -0
- package/src/runtime/diagnostics/flow-context.ts +18 -7
- package/src/runtime/diagnostics/index.ts +96 -61
- package/src/runtime/diagnostics/internal-event-contracts.ts +87 -33
- package/src/runtime/diagnostics/message-flow.ts +107 -79
- package/src/runtime/diagnostics/runtime-metrics.ts +46 -24
- package/src/runtime/diagnostics/runtime-observation-queue.ts +17 -28
- package/src/runtime/diagnostics/topology-runtime-projections.ts +62 -43
- package/src/runtime/execution/index.ts +18 -26
- package/src/runtime/execution/serial-execution-queue.ts +31 -40
- package/src/runtime/execution/state-lane.ts +2 -2
- package/src/runtime/foundation/actor-join-recovery-codec.ts +69 -55
- package/src/runtime/foundation/event-loop-resources.ts +8 -4
- package/src/runtime/foundation/message-follow-suppression-registry.ts +7 -14
- package/src/runtime/foundation/operation-identity.ts +1 -2
- package/src/runtime/foundation/operation-registry.ts +8 -2
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +364 -396
- package/src/runtime/foundation/route-mesh-connection-policy.ts +7 -8
- package/src/runtime/foundation/runtime-state-projections.ts +24 -23
- package/src/runtime/foundation/service-authority-payload-codec.ts +54 -57
- package/src/runtime/foundation/service-discovery-registry.ts +67 -59
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +28 -29
- package/src/runtime/foundation/service-liveness-registry.ts +18 -13
- package/src/runtime/foundation/service-mailbox.ts +14 -14
- package/src/runtime/foundation/service-maintenance-runtime.ts +22 -21
- package/src/runtime/foundation/service-metadata-codec.ts +2 -9
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +39 -36
- package/src/runtime/foundation/service-relocation-coordinator.ts +1 -4
- package/src/runtime/foundation/service-relocation-object-owner.ts +40 -58
- package/src/runtime/foundation/service-relocation-runtime.ts +292 -216
- package/src/runtime/foundation/service-runtime-contracts.ts +8 -8
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -4
- package/src/runtime/foundation/service-stateful-registry.ts +69 -59
- package/src/runtime/foundation/service-stateful-runtime.ts +1233 -1112
- package/src/runtime/foundation/service-stateful-wire-codec.ts +318 -270
- package/src/runtime/foundation/service-topology-registry.ts +170 -159
- package/src/runtime/foundation/service-weighted-selection.ts +9 -15
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -12
- package/src/runtime/foundation/service-wire-m6a-codec.ts +69 -47
- package/src/runtime/framework-errors-internal.ts +31 -30
- package/src/runtime/handlers/handler-instance-scope.ts +18 -29
- package/src/runtime/handlers/index.ts +18 -8
- package/src/runtime/host/actor-packet-relay.ts +290 -261
- package/src/runtime/host/actor-placement-coordinator.ts +165 -150
- package/src/runtime/host/actor-runtime-options-factory.ts +89 -87
- package/src/runtime/host/actor-transfer-authority-runtime.ts +46 -38
- package/src/runtime/host/actor-transfer-runtime.ts +391 -395
- package/src/runtime/host/application-job-queue.ts +32 -48
- package/src/runtime/host/bound-session-relay.ts +7 -9
- package/src/runtime/host/channel-runtime-options-factory.ts +75 -35
- package/src/runtime/host/host-capacity-status.ts +10 -9
- package/src/runtime/host/index.ts +861 -789
- package/src/runtime/host/instance-activation-authority.ts +125 -143
- package/src/runtime/host/location-runtime-owner.ts +38 -26
- package/src/runtime/host/mesh-router-resolver.ts +30 -23
- package/src/runtime/host/relocation-direct-transfer.ts +15 -15
- package/src/runtime/host/relocation-integrity-fault-gate.ts +3 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +43 -34
- package/src/runtime/host/remote-actor-packet-target-store.ts +54 -52
- package/src/runtime/host/remote-bound-session-relay.ts +274 -247
- package/src/runtime/host/route-mesh-runtime-options.ts +1 -3
- package/src/runtime/host/route-mesh-runtime.ts +227 -181
- package/src/runtime/host/runtime-shutdown.ts +4 -3
- package/src/runtime/host/service-relocation-control.ts +14 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1388 -1165
- package/src/runtime/host/spot-address-transport.ts +284 -237
- package/src/runtime/host/spot-node-runtime-options-factory.ts +14 -8
- package/src/runtime/host/spot-runtime-options-factory.ts +71 -62
- package/src/runtime/host/stateful-authority-route-runtime.ts +117 -116
- package/src/runtime/host/user-spot-creation-coordinator.ts +225 -220
- package/src/runtime/locations/actor-location-claims.ts +61 -49
- package/src/runtime/locations/actor-session-route-claims.ts +1 -4
- package/src/runtime/locations/aggregate-inventory-store.ts +105 -134
- package/src/runtime/locations/authority-key-codec.ts +13 -10
- package/src/runtime/locations/auto-connect-loop.ts +14 -11
- package/src/runtime/locations/auto-connect-planner.ts +42 -31
- package/src/runtime/locations/auto-connect-reconciler.ts +106 -63
- package/src/runtime/locations/canonical-codec.ts +3 -1
- package/src/runtime/locations/creation-operation-id.ts +4 -3
- package/src/runtime/locations/domain-store-contract.ts +13 -7
- package/src/runtime/locations/in-memory-authority-store.ts +232 -199
- package/src/runtime/locations/in-memory-location-store.ts +432 -250
- package/src/runtime/locations/in-memory-provider-location-store.ts +16 -17
- package/src/runtime/locations/internal-store-contracts.ts +95 -38
- package/src/runtime/locations/key-codec.ts +3 -4
- package/src/runtime/locations/lease-tracker.ts +36 -27
- package/src/runtime/locations/lifecycle-runtime.ts +15 -3
- package/src/runtime/locations/lifecycle.ts +33 -28
- package/src/runtime/locations/location-store-repository.ts +1329 -1185
- package/src/runtime/locations/opaque-record-key.ts +4 -9
- package/src/runtime/locations/resolvers.ts +201 -178
- package/src/runtime/locations/runtime.ts +251 -159
- package/src/runtime/locations/spot-location-claims.ts +110 -112
- package/src/runtime/messaging/creation-payload-codec.ts +4 -1
- package/src/runtime/messaging/framework-json-v1.ts +34 -15
- package/src/runtime/messaging/packet-name.ts +8 -6
- package/src/runtime/messaging/payload-codec.ts +70 -50
- package/src/runtime/messaging/submission-result.ts +6 -9
- package/src/runtime/protocol/service_wire_codec.generated.ts +1376 -159
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +19 -18
- package/src/runtime/routing-id.ts +10 -7
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +56 -62
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +23 -20
- package/src/runtime/spots/index.ts +595 -564
- package/src/runtime/spots/spot-activation-registry.ts +38 -34
- package/src/runtime/spots/spot-activation-state.ts +43 -51
- package/src/runtime/spots/spot-activation.ts +179 -116
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +110 -78
- package/src/runtime/spots/spot-actor-join-dispatch.ts +57 -41
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +5 -7
- package/src/runtime/spots/spot-actor-membership.ts +25 -27
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +196 -148
- package/src/runtime/spots/spot-actor-packet-drain.ts +56 -42
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +37 -39
- package/src/runtime/spots/spot-closing.ts +11 -12
- package/src/runtime/spots/spot-context.ts +46 -26
- package/src/runtime/spots/spot-entry-activation.ts +84 -65
- package/src/runtime/spots/spot-handle.ts +17 -15
- package/src/runtime/spots/spot-handler-registry.ts +44 -31
- package/src/runtime/spots/spot-location-claim.ts +5 -4
- package/src/runtime/spots/spot-manager-public.ts +62 -82
- package/src/runtime/spots/spot-native-actor-join-admission.ts +20 -16
- package/src/runtime/spots/spot-node-autoconnect.ts +54 -61
- package/src/runtime/spots/spot-node-runtime-manager.ts +235 -222
- package/src/runtime/spots/spot-outbound.ts +47 -59
- package/src/runtime/spots/spot-publisher-transport.ts +5 -4
- package/src/runtime/spots/spot-remote-codec.ts +66 -65
- package/src/runtime/spots/spot-remote-route-codec.ts +61 -41
- package/src/runtime/spots/spot-route-packet-dispatch.ts +129 -95
- package/src/runtime/spots/spot-route-replies.ts +23 -24
- package/src/runtime/spots/spot-route-reply-wire.ts +3 -2
- package/src/runtime/spots/spot-routed-actor-admission.ts +37 -27
- package/src/runtime/spots/spot-routed-bound-session-dispatch.ts +13 -18
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +18 -15
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +35 -26
- package/src/runtime/spots/spot-routing-internal.ts +1 -4
- package/src/runtime/spots/spot-runtime-ports.ts +5 -5
- package/src/runtime/spots/spot-serial-executor.ts +5 -9
- package/src/runtime/spots/spot-serial-turn-executor.ts +19 -26
- package/src/runtime/spots/spot-subscription-dispatch.ts +58 -47
- package/src/runtime/spots/spot-timer.ts +103 -91
- package/src/runtime/streams/actor-session-binding-registry.ts +421 -292
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +8 -4
- package/src/runtime/streams/actor-session-lifecycle-coordinator.ts +3 -1
- package/src/runtime/streams/bound-actor-relay-sender.ts +60 -50
- package/src/runtime/streams/bound-session-response-target.ts +39 -9
- package/src/runtime/streams/bound-session-service.ts +52 -42
- package/src/runtime/streams/index.ts +183 -100
- package/src/runtime/streams/managed-stream.ts +123 -90
- package/src/runtime/streams/native-fallback-bound-session.ts +57 -52
- package/src/runtime/streams/protocol.ts +115 -46
- package/src/runtime/streams/session-actor-coordinator.ts +109 -93
- package/src/runtime/streams/session-calls.ts +2 -8
- package/src/runtime/streams/session-context.ts +96 -51
- package/src/runtime/streams/session-local-actors.ts +19 -3
- package/src/runtime/streams/session-provider.ts +5 -7
- package/src/runtime/streams/session-serial-executor.ts +7 -6
- package/src/runtime/streams/stream-binding-runtime-ports.ts +79 -29
- package/src/runtime/streams/stream-frame-factory.ts +59 -40
- package/src/runtime/streams/stream-session-runtime.ts +317 -214
- package/src/runtime/workers/index.ts +68 -29
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import { ZLinkFrameworkInternalErrorKind, createInternalFrameworkException } from '../framework-errors-internal';
|
|
2
|
-
import type {
|
|
3
|
-
ZLinkMessageSerializer,
|
|
4
|
-
RoutingId,
|
|
5
|
-
ZLinkSession
|
|
6
|
-
} from '../../contracts';
|
|
7
|
-
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
8
1
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from '
|
|
2
|
+
ZLinkFrameworkInternalErrorKind,
|
|
3
|
+
createInternalFrameworkException
|
|
4
|
+
} from '../framework-errors-internal';
|
|
5
|
+
import type { ZLinkMessageSerializer, RoutingId, ZLinkSession } from '../../contracts';
|
|
6
|
+
import type { ZLinkProviderResolver } from '../../contracts/Common/ZLinkProviderResolver';
|
|
12
7
|
import { ZLinkSocketNativeEventType } from '../diagnostics/internal-event-contracts';
|
|
13
8
|
import {
|
|
14
9
|
ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
|
|
@@ -20,6 +15,7 @@ import {
|
|
|
20
15
|
import type { Message } from '../../contracts/Common/Message';
|
|
21
16
|
import { throwIfAborted } from '../abort';
|
|
22
17
|
import { ZLinkDispatchErrorReporter, ZLinkRouteDisconnectedError } from '../channels';
|
|
18
|
+
import { boundSessionErrorPayload } from './bound-session-response-target';
|
|
23
19
|
import { flowIfEnabled } from '../diagnostics';
|
|
24
20
|
import type { ZLinkRuntimeMetrics } from '../diagnostics';
|
|
25
21
|
import { wrapFrameworkPayloadMessage } from '../messaging/payload-codec';
|
|
@@ -130,10 +126,10 @@ export interface ZLinkStreamSessionRuntimeOptions {
|
|
|
130
126
|
readonly socket: ZLinkBackendStreamSocket;
|
|
131
127
|
readonly nativeSessionService?: StreamSessionService;
|
|
132
128
|
readonly meshCompletions?: ZLinkMeshCompletionTable;
|
|
133
|
-
readonly nativeSessionRouteForMesh?: (
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
129
|
+
readonly nativeSessionRouteForMesh?: (meshName: string) => ZLinkNativeSessionRoute | undefined;
|
|
130
|
+
readonly sessionFactory: (
|
|
131
|
+
context: DefaultZLinkSessionContext
|
|
132
|
+
) => ZLinkSession | Promise<ZLinkSession>;
|
|
137
133
|
readonly bindingRuntime: ZLinkStreamSessionContextFactory;
|
|
138
134
|
readonly providerResolver?: ZLinkProviderResolver;
|
|
139
135
|
readonly onError?: (error: unknown) => void;
|
|
@@ -172,7 +168,10 @@ export class ZLinkStreamSessionRuntime {
|
|
|
172
168
|
constructor(
|
|
173
169
|
private readonly options: ZLinkStreamSessionRuntimeOptions & ZLinkStreamLivenessOptions,
|
|
174
170
|
routingId: unknown,
|
|
175
|
-
private readonly removeSession: (
|
|
171
|
+
private readonly removeSession: (
|
|
172
|
+
sessionId: string,
|
|
173
|
+
session: ZLinkStreamSessionRuntime
|
|
174
|
+
) => void = () => {}
|
|
176
175
|
) {
|
|
177
176
|
this.livenessClock = options.livenessClock ?? systemLivenessClock;
|
|
178
177
|
this.stream = new ZLinkManagedStream(
|
|
@@ -198,12 +197,12 @@ export class ZLinkStreamSessionRuntime {
|
|
|
198
197
|
const sessionOrPromise = options.sessionFactory(this.context);
|
|
199
198
|
this.sessionReady = isPromiseLike(sessionOrPromise)
|
|
200
199
|
? sessionOrPromise.then(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
200
|
+
(session) => this.completeSessionCreation(session),
|
|
201
|
+
(error) => {
|
|
202
|
+
this.context.completeConfiguration();
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
)
|
|
207
206
|
: Promise.resolve(this.completeSessionCreation(sessionOrPromise));
|
|
208
207
|
}
|
|
209
208
|
|
|
@@ -252,17 +251,19 @@ export class ZLinkStreamSessionRuntime {
|
|
|
252
251
|
};
|
|
253
252
|
if (decodedHeader.kind === ZLinkStreamMessageKind.Control) {
|
|
254
253
|
if (
|
|
255
|
-
messageToBytes(payload).length === 0
|
|
256
|
-
|
|
257
|
-
|
|
254
|
+
messageToBytes(payload).length === 0 &&
|
|
255
|
+
(decodedHeader.name === ZLINK_STREAM_HEARTBEAT_PONG ||
|
|
256
|
+
decodedHeader.name === ZLINK_STREAM_HEARTBEAT_PING)
|
|
258
257
|
) {
|
|
259
|
-
void this.handleControl(decodedHeader, payload)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
258
|
+
void this.handleControl(decodedHeader, payload)
|
|
259
|
+
.catch((error) => {
|
|
260
|
+
this.options.onError?.(error);
|
|
261
|
+
})
|
|
262
|
+
.finally(() => {
|
|
263
|
+
applicationJobPermit?.releaseAfterInternalProcessing();
|
|
264
|
+
payload.close();
|
|
265
|
+
releaseTerminal();
|
|
266
|
+
});
|
|
266
267
|
return;
|
|
267
268
|
}
|
|
268
269
|
this.enqueueControl(
|
|
@@ -285,8 +286,8 @@ export class ZLinkStreamSessionRuntime {
|
|
|
285
286
|
return;
|
|
286
287
|
}
|
|
287
288
|
if (
|
|
288
|
-
decodedHeader.kind === ZLinkStreamMessageKind.Response
|
|
289
|
-
|
|
289
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Response ||
|
|
290
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Error
|
|
290
291
|
) {
|
|
291
292
|
this.enqueueInfrastructure(
|
|
292
293
|
async () => {
|
|
@@ -352,13 +353,13 @@ export class ZLinkStreamSessionRuntime {
|
|
|
352
353
|
if (forcedClose) return;
|
|
353
354
|
this.livenessClock.setTimer(() => {
|
|
354
355
|
if (
|
|
355
|
-
this.disposed
|
|
356
|
-
|
|
357
|
-
|
|
356
|
+
this.disposed ||
|
|
357
|
+
this.disconnected ||
|
|
358
|
+
!this.context.isExactRetiredActorBinding(actor, retiredSession)
|
|
358
359
|
) {
|
|
359
360
|
return;
|
|
360
361
|
}
|
|
361
|
-
void this.close().catch(error => this.options.onError?.(error));
|
|
362
|
+
void this.close().catch((error) => this.options.onError?.(error));
|
|
362
363
|
}, ZLINK_STREAM_ACTOR_BINDING_REPLACEMENT_CLOSE_DELAY_MS);
|
|
363
364
|
};
|
|
364
365
|
const completeCallback = (): void => {
|
|
@@ -380,16 +381,15 @@ export class ZLinkStreamSessionRuntime {
|
|
|
380
381
|
};
|
|
381
382
|
callbackDeadlineTimer = this.livenessClock.setTimer(() => {
|
|
382
383
|
if (
|
|
383
|
-
this.disposed
|
|
384
|
-
|
|
385
|
-
|
|
384
|
+
this.disposed ||
|
|
385
|
+
this.disconnected ||
|
|
386
|
+
!this.context.isExactRetiredActorBinding(actor, retiredSession)
|
|
386
387
|
) {
|
|
387
388
|
return;
|
|
388
389
|
}
|
|
389
390
|
forcedClose = true;
|
|
390
|
-
void this.close().catch(error => this.options.onError?.(error));
|
|
391
|
-
}, this.options.replacementCallbackTimeoutMs
|
|
392
|
-
?? ZLINK_STREAM_ACTOR_BINDING_REPLACEMENT_CALLBACK_TIMEOUT_MS);
|
|
391
|
+
void this.close().catch((error) => this.options.onError?.(error));
|
|
392
|
+
}, this.options.replacementCallbackTimeoutMs ?? ZLINK_STREAM_ACTOR_BINDING_REPLACEMENT_CALLBACK_TIMEOUT_MS);
|
|
393
393
|
|
|
394
394
|
const callback = session.onActorBindingReplaced;
|
|
395
395
|
if (callback === undefined) {
|
|
@@ -400,10 +400,7 @@ export class ZLinkStreamSessionRuntime {
|
|
|
400
400
|
// Start the callback on this lifecycle turn, but do not retain the
|
|
401
401
|
// serial lane while application code awaits an unrelated operation.
|
|
402
402
|
const result = callback.call(session, this.context, actor.actorId);
|
|
403
|
-
void Promise.resolve(result).then(
|
|
404
|
-
() => completeCallback(),
|
|
405
|
-
reportCallbackFailure
|
|
406
|
-
);
|
|
403
|
+
void Promise.resolve(result).then(() => completeCallback(), reportCallbackFailure);
|
|
407
404
|
} catch (error) {
|
|
408
405
|
reportCallbackFailure(error);
|
|
409
406
|
}
|
|
@@ -480,76 +477,148 @@ export class ZLinkStreamSessionRuntime {
|
|
|
480
477
|
if (this.context.tryCompleteResponse(decodedHeader, dispatchPayload)) {
|
|
481
478
|
return;
|
|
482
479
|
}
|
|
480
|
+
const dispatchActor = this.context.actorForSlot(decodedHeader.actorSlot);
|
|
481
|
+
if (decodedHeader.actorSlot !== undefined && dispatchActor === undefined) {
|
|
482
|
+
const staleFlowEnabled = this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true;
|
|
483
|
+
await runWithFlow(
|
|
484
|
+
createInboundFlow(
|
|
485
|
+
decodedHeader.flowId,
|
|
486
|
+
decodedHeader.flowOrigin,
|
|
487
|
+
staleFlowEnabled,
|
|
488
|
+
staleFlowEnabled ? this.stream.sessionId : undefined
|
|
489
|
+
),
|
|
490
|
+
async () => {
|
|
491
|
+
if (decodedHeader.kind === ZLinkStreamMessageKind.Request) {
|
|
492
|
+
const error = createInternalFrameworkException(
|
|
493
|
+
ZLinkFrameworkInternalErrorKind.InvalidOperation,
|
|
494
|
+
'Actor slot is not a current binding.'
|
|
495
|
+
);
|
|
496
|
+
this.options.dispatchErrors?.report({
|
|
497
|
+
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
498
|
+
messageKind: ZLinkDispatchMessageKind.Request,
|
|
499
|
+
reason: ZLinkDispatchErrorReason.StaleTarget,
|
|
500
|
+
action: ZLinkDispatchErrorAction.ReplyError,
|
|
501
|
+
packetName: decodedHeader.name,
|
|
502
|
+
sourceRid:
|
|
503
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId),
|
|
504
|
+
correlationId: decodedHeader.correlationId,
|
|
505
|
+
flowId: decodedHeader.flowId,
|
|
506
|
+
flowOrigin: decodedHeader.flowOrigin,
|
|
507
|
+
error
|
|
508
|
+
});
|
|
509
|
+
await this.replyDispatchError(decodedHeader, error);
|
|
510
|
+
} else {
|
|
511
|
+
flowIfEnabled(
|
|
512
|
+
this.options.dispatchErrors?.flow,
|
|
513
|
+
ZLinkMessageFlowOutcome.Dropped
|
|
514
|
+
)?.trace({
|
|
515
|
+
outcome: ZLinkMessageFlowOutcome.Dropped,
|
|
516
|
+
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
517
|
+
messageKind: ZLinkDispatchMessageKind.Send,
|
|
518
|
+
packetName: decodedHeader.name,
|
|
519
|
+
correlationId: decodedHeader.correlationId,
|
|
520
|
+
sourceRid:
|
|
521
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId),
|
|
522
|
+
errorReason: ZLinkDispatchErrorReason.StaleTarget
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
);
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
483
529
|
this.context.enterDispatch(decodedHeader);
|
|
484
530
|
enteredDispatch = true;
|
|
485
531
|
const session = await this.requireSession();
|
|
486
|
-
const streamKind =
|
|
487
|
-
|
|
488
|
-
|
|
532
|
+
const streamKind =
|
|
533
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Request
|
|
534
|
+
? ZLinkDispatchMessageKind.Request
|
|
535
|
+
: ZLinkDispatchMessageKind.Send;
|
|
489
536
|
const streamCorr = decodedHeader.correlationId;
|
|
490
537
|
const inboundHeader = decodedHeader;
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
)
|
|
529
|
-
);
|
|
530
|
-
if (streamKind === ZLinkDispatchMessageKind.Send) {
|
|
531
|
-
flowIfEnabled(this.options.dispatchErrors?.flow, ZLinkMessageFlowOutcome.Completed)?.trace({
|
|
532
|
-
outcome: ZLinkMessageFlowOutcome.Completed,
|
|
538
|
+
const flowEnabled = this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true;
|
|
539
|
+
await runWithFlow(
|
|
540
|
+
createInboundFlow(
|
|
541
|
+
inboundHeader.flowId,
|
|
542
|
+
inboundHeader.flowOrigin,
|
|
543
|
+
flowEnabled,
|
|
544
|
+
flowEnabled ? this.stream.sessionId : undefined
|
|
545
|
+
),
|
|
546
|
+
async () => {
|
|
547
|
+
flowIfEnabled(this.options.dispatchErrors?.flow, ZLinkMessageFlowOutcome.Received)?.trace(
|
|
548
|
+
{
|
|
549
|
+
outcome: ZLinkMessageFlowOutcome.Received,
|
|
550
|
+
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
551
|
+
messageKind: streamKind,
|
|
552
|
+
packetName: inboundHeader.name,
|
|
553
|
+
correlationId: streamCorr,
|
|
554
|
+
sourceRid:
|
|
555
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
556
|
+
}
|
|
557
|
+
);
|
|
558
|
+
flowIfEnabled(this.options.dispatchErrors?.flow, ZLinkMessageFlowOutcome.Admitted)?.trace(
|
|
559
|
+
{
|
|
560
|
+
outcome: ZLinkMessageFlowOutcome.Admitted,
|
|
561
|
+
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
562
|
+
messageKind: streamKind,
|
|
563
|
+
packetName: inboundHeader.name,
|
|
564
|
+
correlationId: streamCorr,
|
|
565
|
+
sourceRid:
|
|
566
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
567
|
+
}
|
|
568
|
+
);
|
|
569
|
+
releaseApplicationJobPermitBeforeHandler();
|
|
570
|
+
flowIfEnabled(
|
|
571
|
+
this.options.dispatchErrors?.flow,
|
|
572
|
+
ZLinkMessageFlowOutcome.Dispatched
|
|
573
|
+
)?.trace({
|
|
574
|
+
outcome: ZLinkMessageFlowOutcome.Dispatched,
|
|
533
575
|
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
534
576
|
messageKind: streamKind,
|
|
535
577
|
packetName: inboundHeader.name,
|
|
536
578
|
correlationId: streamCorr,
|
|
537
|
-
sourceRid:
|
|
579
|
+
sourceRid:
|
|
580
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
538
581
|
});
|
|
582
|
+
await session.onDispatch?.(
|
|
583
|
+
createSessionDispatchContext(inboundHeader, dispatchActor),
|
|
584
|
+
wrapFrameworkPayloadMessage(
|
|
585
|
+
dispatchPayload,
|
|
586
|
+
this.options.messageSerializers,
|
|
587
|
+
streamCodecContentType(inboundHeader.codec),
|
|
588
|
+
inboundHeader.name
|
|
589
|
+
)
|
|
590
|
+
);
|
|
591
|
+
if (streamKind === ZLinkDispatchMessageKind.Send) {
|
|
592
|
+
flowIfEnabled(
|
|
593
|
+
this.options.dispatchErrors?.flow,
|
|
594
|
+
ZLinkMessageFlowOutcome.Completed
|
|
595
|
+
)?.trace({
|
|
596
|
+
outcome: ZLinkMessageFlowOutcome.Completed,
|
|
597
|
+
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
598
|
+
messageKind: streamKind,
|
|
599
|
+
packetName: inboundHeader.name,
|
|
600
|
+
correlationId: streamCorr,
|
|
601
|
+
sourceRid:
|
|
602
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
603
|
+
});
|
|
604
|
+
}
|
|
539
605
|
}
|
|
540
|
-
|
|
606
|
+
);
|
|
541
607
|
} catch (error) {
|
|
542
608
|
this.options.dispatchErrors?.report({
|
|
543
609
|
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
544
|
-
messageKind:
|
|
545
|
-
|
|
546
|
-
|
|
610
|
+
messageKind:
|
|
611
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Request
|
|
612
|
+
? ZLinkDispatchMessageKind.Request
|
|
613
|
+
: ZLinkDispatchMessageKind.Send,
|
|
547
614
|
reason: ZLinkDispatchErrorReason.HandlerException,
|
|
548
|
-
action:
|
|
549
|
-
|
|
550
|
-
|
|
615
|
+
action:
|
|
616
|
+
decodedHeader.requestSeq === undefined
|
|
617
|
+
? ZLinkDispatchErrorAction.Drop
|
|
618
|
+
: ZLinkDispatchErrorAction.ReplyError,
|
|
551
619
|
packetName: decodedHeader.name,
|
|
552
|
-
sourceRid:
|
|
620
|
+
sourceRid:
|
|
621
|
+
this.context.routingId === undefined ? undefined : String(this.context.routingId),
|
|
553
622
|
correlationId: decodedHeader.correlationId,
|
|
554
623
|
flowId: decodedHeader.flowId,
|
|
555
624
|
flowOrigin: decodedHeader.flowOrigin,
|
|
@@ -602,7 +671,9 @@ export class ZLinkStreamSessionRuntime {
|
|
|
602
671
|
this.livenessTimer = this.livenessClock.setTimer(() => {
|
|
603
672
|
this.livenessTimer = undefined;
|
|
604
673
|
this.serial.executeInfrastructure(
|
|
605
|
-
async () => this.runLivenessCheck(),
|
|
674
|
+
async () => this.runLivenessCheck(),
|
|
675
|
+
{},
|
|
676
|
+
(error) => this.options.onError?.(error)
|
|
606
677
|
);
|
|
607
678
|
}, ZLINK_STREAM_HEARTBEAT_INTERVAL_MS);
|
|
608
679
|
}
|
|
@@ -621,8 +692,8 @@ export class ZLinkStreamSessionRuntime {
|
|
|
621
692
|
return;
|
|
622
693
|
}
|
|
623
694
|
if (
|
|
624
|
-
this.awaitingPongSince !== undefined
|
|
625
|
-
|
|
695
|
+
this.awaitingPongSince !== undefined &&
|
|
696
|
+
now - this.awaitingPongSince >= ZLINK_STREAM_HEARTBEAT_TIMEOUT_MS
|
|
626
697
|
) {
|
|
627
698
|
await this.closeForLiveness(
|
|
628
699
|
ZLinkStreamCloseReasonCode.HeartbeatTimeout,
|
|
@@ -674,14 +745,7 @@ export class ZLinkStreamSessionRuntime {
|
|
|
674
745
|
ZLinkStreamMessageKind.Error,
|
|
675
746
|
new Map(),
|
|
676
747
|
false,
|
|
677
|
-
|
|
678
|
-
code: error instanceof ZLinkFrameworkException
|
|
679
|
-
? ZLinkFrameworkErrorKind[error.kind]
|
|
680
|
-
: error instanceof Error
|
|
681
|
-
? error.constructor.name
|
|
682
|
-
: 'RemoteError',
|
|
683
|
-
message: error instanceof Error ? error.message : String(error)
|
|
684
|
-
}
|
|
748
|
+
boundSessionErrorPayload(error)
|
|
685
749
|
);
|
|
686
750
|
try {
|
|
687
751
|
if (!this.context.stream.writeRaw(message, ZLINK_SEND_DONT_WAIT)) {
|
|
@@ -706,20 +770,21 @@ export class ZLinkStreamSessionRuntime {
|
|
|
706
770
|
packetName: string,
|
|
707
771
|
correlationId: string | undefined
|
|
708
772
|
): void {
|
|
709
|
-
const reply = kind === ZLinkStreamMessageKind.Response
|
|
710
|
-
|| kind === ZLinkStreamMessageKind.Error;
|
|
773
|
+
const reply = kind === ZLinkStreamMessageKind.Response || kind === ZLinkStreamMessageKind.Error;
|
|
711
774
|
const outcome = reply ? ZLinkMessageFlowOutcome.Replied : ZLinkMessageFlowOutcome.Sent;
|
|
712
775
|
flowIfEnabled(this.options.dispatchErrors?.flow, outcome)?.trace({
|
|
713
776
|
outcome,
|
|
714
777
|
surface: ZLinkDispatchErrorSurface.StreamSession,
|
|
715
|
-
messageKind:
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
778
|
+
messageKind:
|
|
779
|
+
kind === ZLinkStreamMessageKind.Response
|
|
780
|
+
? ZLinkDispatchMessageKind.Response
|
|
781
|
+
: kind === ZLinkStreamMessageKind.Error
|
|
782
|
+
? ZLinkDispatchMessageKind.Error
|
|
783
|
+
: ZLinkDispatchMessageKind.Send,
|
|
720
784
|
packetName: packetName.length === 0 ? undefined : packetName,
|
|
721
785
|
correlationId,
|
|
722
|
-
sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId)
|
|
786
|
+
sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId),
|
|
787
|
+
streamSessionId: this.stream.sessionId
|
|
723
788
|
});
|
|
724
789
|
}
|
|
725
790
|
|
|
@@ -748,15 +813,17 @@ export class ZLinkStreamSessionRuntime {
|
|
|
748
813
|
if (this.disconnected || this.disconnectQueued) return;
|
|
749
814
|
this.disconnectQueued = true;
|
|
750
815
|
this.stopLivenessChecks();
|
|
751
|
-
void this.serial
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
816
|
+
void this.serial
|
|
817
|
+
.executeFinal(async () => {
|
|
818
|
+
this.disconnectQueued = false;
|
|
819
|
+
if (this.disconnected) return;
|
|
820
|
+
this.stream.markTransportClosed();
|
|
821
|
+
this.disconnected = true;
|
|
822
|
+
await this.complete(error, true);
|
|
823
|
+
})
|
|
824
|
+
.catch(() => {
|
|
825
|
+
this.disconnectQueued = false;
|
|
826
|
+
});
|
|
760
827
|
}
|
|
761
828
|
|
|
762
829
|
private async cleanup(): Promise<void> {
|
|
@@ -808,16 +875,22 @@ export class ZLinkStreamSessionRuntime {
|
|
|
808
875
|
onRejected?.(error);
|
|
809
876
|
return;
|
|
810
877
|
}
|
|
811
|
-
if (
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
878
|
+
if (
|
|
879
|
+
!this.serial.executeApplication(
|
|
880
|
+
async () => {
|
|
881
|
+
try {
|
|
882
|
+
await work();
|
|
883
|
+
} finally {
|
|
884
|
+
claim?.close();
|
|
885
|
+
}
|
|
886
|
+
},
|
|
887
|
+
{},
|
|
888
|
+
() => {
|
|
889
|
+
claim?.close();
|
|
890
|
+
onRejected?.();
|
|
891
|
+
}
|
|
892
|
+
)
|
|
893
|
+
) {
|
|
821
894
|
claim?.close();
|
|
822
895
|
// The serial lane only refuses new work after dispose() closed it.
|
|
823
896
|
onShutdownRejected?.();
|
|
@@ -845,6 +918,7 @@ export class ZLinkStreamSessionRuntime {
|
|
|
845
918
|
packetName: header.name === '' ? undefined : header.name,
|
|
846
919
|
correlationId: header.correlationId,
|
|
847
920
|
sourceRid: this.context.routingId === undefined ? undefined : String(this.context.routingId),
|
|
921
|
+
streamSessionId: this.stream.sessionId,
|
|
848
922
|
flowId: flowEnabled ? header.flowId : undefined,
|
|
849
923
|
flowOrigin: flowEnabled ? header.flowOrigin : undefined,
|
|
850
924
|
errorReason: ZLinkDispatchErrorReason.Shutdown
|
|
@@ -854,21 +928,29 @@ export class ZLinkStreamSessionRuntime {
|
|
|
854
928
|
|
|
855
929
|
function streamShutdownDropMessageKind(kind: ZLinkStreamMessageKind): ZLinkDispatchMessageKind {
|
|
856
930
|
switch (kind) {
|
|
857
|
-
case ZLinkStreamMessageKind.Request:
|
|
858
|
-
|
|
859
|
-
case ZLinkStreamMessageKind.
|
|
860
|
-
|
|
861
|
-
|
|
931
|
+
case ZLinkStreamMessageKind.Request:
|
|
932
|
+
return ZLinkDispatchMessageKind.Request;
|
|
933
|
+
case ZLinkStreamMessageKind.Response:
|
|
934
|
+
return ZLinkDispatchMessageKind.Response;
|
|
935
|
+
case ZLinkStreamMessageKind.Error:
|
|
936
|
+
return ZLinkDispatchMessageKind.Error;
|
|
937
|
+
case ZLinkStreamMessageKind.Control:
|
|
938
|
+
return ZLinkDispatchMessageKind.Control;
|
|
939
|
+
default:
|
|
940
|
+
return ZLinkDispatchMessageKind.Send;
|
|
862
941
|
}
|
|
863
942
|
}
|
|
864
943
|
|
|
865
944
|
export class ZLinkStreamSessionNodeRuntime {
|
|
866
945
|
private readonly sessions = new Map<string, ZLinkStreamSessionRuntime>();
|
|
867
946
|
private readonly availablePackets: ZLinkBackendStreamPacket[] = [];
|
|
868
|
-
private readonly pendingConnectionMetadata: Array<
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
947
|
+
private readonly pendingConnectionMetadata: Array<
|
|
948
|
+
| {
|
|
949
|
+
readonly localAddr?: string;
|
|
950
|
+
readonly remoteAddr?: string;
|
|
951
|
+
}
|
|
952
|
+
| undefined
|
|
953
|
+
> = [];
|
|
872
954
|
private pendingConnectionMetadataHead = 0;
|
|
873
955
|
private pendingConnectionMetadataCount = 0;
|
|
874
956
|
private readonly unaddressedMonitorSessions: Array<string | undefined> = [];
|
|
@@ -899,21 +981,21 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
899
981
|
return;
|
|
900
982
|
}
|
|
901
983
|
const monitor = this.options.monitor;
|
|
902
|
-
monitor?.onEvent(event => this.onMonitorEvent(event));
|
|
903
|
-
const running = this.runReceiveLoop(this.receiveAbortController.signal)
|
|
904
|
-
.
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
});
|
|
984
|
+
monitor?.onEvent((event) => this.onMonitorEvent(event));
|
|
985
|
+
const running = this.runReceiveLoop(this.receiveAbortController.signal).catch((error) => {
|
|
986
|
+
if (!this.stopped) {
|
|
987
|
+
this.options.onError?.(error);
|
|
988
|
+
}
|
|
989
|
+
});
|
|
909
990
|
this.receiveLoop = running;
|
|
910
991
|
if (monitor !== undefined) {
|
|
911
|
-
this.monitorLoop = this.runMonitorLoop(monitor, this.receiveAbortController.signal)
|
|
912
|
-
|
|
992
|
+
this.monitorLoop = this.runMonitorLoop(monitor, this.receiveAbortController.signal).catch(
|
|
993
|
+
(error) => {
|
|
913
994
|
if (!this.stopped) {
|
|
914
995
|
this.options.onError?.(error);
|
|
915
996
|
}
|
|
916
|
-
}
|
|
997
|
+
}
|
|
998
|
+
);
|
|
917
999
|
}
|
|
918
1000
|
}
|
|
919
1001
|
|
|
@@ -1046,8 +1128,8 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1046
1128
|
|
|
1047
1129
|
this.receiveWorkSinceYield += 1;
|
|
1048
1130
|
if (
|
|
1049
|
-
this.receiveWorkSinceYield >= ZLINK_STREAM_RECEIVE_FRAME_BATCH_LIMIT
|
|
1050
|
-
|
|
1131
|
+
this.receiveWorkSinceYield >= ZLINK_STREAM_RECEIVE_FRAME_BATCH_LIMIT &&
|
|
1132
|
+
!this.isReceiveStopped(signal)
|
|
1051
1133
|
) {
|
|
1052
1134
|
this.receiveWorkSinceYield = 0;
|
|
1053
1135
|
await new Promise<void>((resolve) => setImmediate(resolve));
|
|
@@ -1055,10 +1137,7 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1055
1137
|
}
|
|
1056
1138
|
}
|
|
1057
1139
|
|
|
1058
|
-
private acceptPacket(
|
|
1059
|
-
packet: ZLinkBackendStreamPacket,
|
|
1060
|
-
permit: ApplicationJobPermitPort
|
|
1061
|
-
): void {
|
|
1140
|
+
private acceptPacket(packet: ZLinkBackendStreamPacket, permit: ApplicationJobPermitPort): void {
|
|
1062
1141
|
const routingId = packet.routingId;
|
|
1063
1142
|
const header = packet.header;
|
|
1064
1143
|
const body = packet.body;
|
|
@@ -1080,16 +1159,17 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1080
1159
|
this.options.dispatchErrors?.flow.flowCreationEnabled() ?? true
|
|
1081
1160
|
);
|
|
1082
1161
|
payload = ownedMessage(body.data());
|
|
1083
|
-
const terminalCompletion =
|
|
1084
|
-
|
|
1162
|
+
const terminalCompletion =
|
|
1163
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Response ||
|
|
1164
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Error;
|
|
1085
1165
|
const applicationPermit = terminalCompletion ? undefined : permit;
|
|
1086
1166
|
if (terminalCompletion) {
|
|
1087
1167
|
permit.releaseAfterInternalProcessing();
|
|
1088
1168
|
releasePermitOnFailure = false;
|
|
1089
1169
|
} else {
|
|
1090
1170
|
if (
|
|
1091
|
-
decodedHeader.kind === ZLinkStreamMessageKind.Send
|
|
1092
|
-
|
|
1171
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Send ||
|
|
1172
|
+
decodedHeader.kind === ZLinkStreamMessageKind.Request
|
|
1093
1173
|
) {
|
|
1094
1174
|
permit.markApplicationQueued();
|
|
1095
1175
|
}
|
|
@@ -1184,7 +1264,10 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1184
1264
|
this.pendingConnectionMetadataCount += 1;
|
|
1185
1265
|
return;
|
|
1186
1266
|
}
|
|
1187
|
-
this.getOrCreateSession(event.routingId)?.enqueueConnected(
|
|
1267
|
+
this.getOrCreateSession(event.routingId)?.enqueueConnected(
|
|
1268
|
+
event.localAddr,
|
|
1269
|
+
event.remoteAddr
|
|
1270
|
+
);
|
|
1188
1271
|
return;
|
|
1189
1272
|
case ZLinkSocketNativeEventType.Disconnected:
|
|
1190
1273
|
{
|
|
@@ -1197,10 +1280,7 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1197
1280
|
session.enqueueDisconnected(error);
|
|
1198
1281
|
return;
|
|
1199
1282
|
}
|
|
1200
|
-
if (
|
|
1201
|
-
event.routingId === undefined
|
|
1202
|
-
&& !streamMonitorHasEndpoint(event)
|
|
1203
|
-
) {
|
|
1283
|
+
if (event.routingId === undefined && !streamMonitorHasEndpoint(event)) {
|
|
1204
1284
|
this.enqueueEndpointlessDisconnect(error);
|
|
1205
1285
|
}
|
|
1206
1286
|
}
|
|
@@ -1212,37 +1292,47 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1212
1292
|
|
|
1213
1293
|
private applyPendingConnectionMetadata(session: ZLinkStreamSessionRuntime): void {
|
|
1214
1294
|
if (
|
|
1215
|
-
session.stream.localAddr !== undefined
|
|
1216
|
-
|
|
1217
|
-
|
|
1295
|
+
session.stream.localAddr !== undefined ||
|
|
1296
|
+
session.stream.remoteAddr !== undefined ||
|
|
1297
|
+
this.pendingConnectionMetadataCount === 0
|
|
1218
1298
|
) {
|
|
1219
1299
|
return;
|
|
1220
1300
|
}
|
|
1221
1301
|
const metadata = this.takePendingConnectionMetadata();
|
|
1222
1302
|
if (metadata === undefined) return;
|
|
1223
|
-
this.removePendingConnectionMetadata(
|
|
1303
|
+
this.removePendingConnectionMetadata(
|
|
1304
|
+
streamMonitorEndpointKey(metadata.localAddr, metadata.remoteAddr)
|
|
1305
|
+
);
|
|
1224
1306
|
session.enqueueConnected(metadata.localAddr, metadata.remoteAddr);
|
|
1225
1307
|
this.enqueueUnaddressedMonitorSession(session.stream.sessionId);
|
|
1226
1308
|
}
|
|
1227
1309
|
|
|
1228
1310
|
private hasPendingConnectionMetadata(endpointKey: string): boolean {
|
|
1229
|
-
for (
|
|
1311
|
+
for (
|
|
1312
|
+
let index = this.pendingConnectionMetadataHead;
|
|
1313
|
+
index < this.pendingConnectionMetadata.length;
|
|
1314
|
+
index += 1
|
|
1315
|
+
) {
|
|
1230
1316
|
const metadata = this.pendingConnectionMetadata[index];
|
|
1231
|
-
if (
|
|
1232
|
-
|
|
1317
|
+
if (
|
|
1318
|
+
metadata !== undefined &&
|
|
1319
|
+
streamMonitorEndpointKey(metadata.localAddr, metadata.remoteAddr) === endpointKey
|
|
1320
|
+
) {
|
|
1233
1321
|
return true;
|
|
1234
1322
|
}
|
|
1235
1323
|
}
|
|
1236
1324
|
return false;
|
|
1237
1325
|
}
|
|
1238
1326
|
|
|
1239
|
-
private takePendingConnectionMetadata():
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1327
|
+
private takePendingConnectionMetadata():
|
|
1328
|
+
| {
|
|
1329
|
+
readonly localAddr?: string;
|
|
1330
|
+
readonly remoteAddr?: string;
|
|
1331
|
+
}
|
|
1332
|
+
| undefined {
|
|
1243
1333
|
while (
|
|
1244
|
-
this.pendingConnectionMetadataHead < this.pendingConnectionMetadata.length
|
|
1245
|
-
|
|
1334
|
+
this.pendingConnectionMetadataHead < this.pendingConnectionMetadata.length &&
|
|
1335
|
+
this.pendingConnectionMetadata[this.pendingConnectionMetadataHead] === undefined
|
|
1246
1336
|
) {
|
|
1247
1337
|
this.pendingConnectionMetadataHead += 1;
|
|
1248
1338
|
}
|
|
@@ -1259,8 +1349,10 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1259
1349
|
if (this.pendingConnectionMetadataCount === 0) {
|
|
1260
1350
|
this.pendingConnectionMetadata.length = 0;
|
|
1261
1351
|
this.pendingConnectionMetadataHead = 0;
|
|
1262
|
-
} else if (
|
|
1263
|
-
|
|
1352
|
+
} else if (
|
|
1353
|
+
this.pendingConnectionMetadataHead >= 1024 &&
|
|
1354
|
+
this.pendingConnectionMetadataHead * 2 >= this.pendingConnectionMetadata.length
|
|
1355
|
+
) {
|
|
1264
1356
|
this.pendingConnectionMetadata.splice(0, this.pendingConnectionMetadataHead);
|
|
1265
1357
|
this.pendingConnectionMetadataHead = 0;
|
|
1266
1358
|
}
|
|
@@ -1273,8 +1365,8 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1273
1365
|
|
|
1274
1366
|
private takeUnaddressedMonitorSession(): string | undefined {
|
|
1275
1367
|
while (
|
|
1276
|
-
this.unaddressedMonitorSessionHead < this.unaddressedMonitorSessions.length
|
|
1277
|
-
|
|
1368
|
+
this.unaddressedMonitorSessionHead < this.unaddressedMonitorSessions.length &&
|
|
1369
|
+
this.unaddressedMonitorSessions[this.unaddressedMonitorSessionHead] === undefined
|
|
1278
1370
|
) {
|
|
1279
1371
|
this.unaddressedMonitorSessionHead += 1;
|
|
1280
1372
|
}
|
|
@@ -1286,8 +1378,10 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1286
1378
|
if (this.unaddressedMonitorSessionCount === 0) {
|
|
1287
1379
|
this.unaddressedMonitorSessions.length = 0;
|
|
1288
1380
|
this.unaddressedMonitorSessionHead = 0;
|
|
1289
|
-
} else if (
|
|
1290
|
-
|
|
1381
|
+
} else if (
|
|
1382
|
+
this.unaddressedMonitorSessionHead >= 1024 &&
|
|
1383
|
+
this.unaddressedMonitorSessionHead * 2 >= this.unaddressedMonitorSessions.length
|
|
1384
|
+
) {
|
|
1291
1385
|
this.unaddressedMonitorSessions.splice(0, this.unaddressedMonitorSessionHead);
|
|
1292
1386
|
this.unaddressedMonitorSessionHead = 0;
|
|
1293
1387
|
}
|
|
@@ -1296,9 +1390,11 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1296
1390
|
|
|
1297
1391
|
private firstUnaddressedSession(): ZLinkStreamSessionRuntime | undefined {
|
|
1298
1392
|
for (const session of this.sessions.values()) {
|
|
1299
|
-
if (
|
|
1300
|
-
|
|
1301
|
-
|
|
1393
|
+
if (
|
|
1394
|
+
!session.isDisconnected &&
|
|
1395
|
+
session.stream.localAddr === undefined &&
|
|
1396
|
+
session.stream.remoteAddr === undefined
|
|
1397
|
+
) {
|
|
1302
1398
|
return session;
|
|
1303
1399
|
}
|
|
1304
1400
|
}
|
|
@@ -1314,7 +1410,11 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1314
1410
|
}
|
|
1315
1411
|
|
|
1316
1412
|
private removePendingConnectionMetadata(endpointKey: string): void {
|
|
1317
|
-
for (
|
|
1413
|
+
for (
|
|
1414
|
+
let index = this.pendingConnectionMetadataHead;
|
|
1415
|
+
index < this.pendingConnectionMetadata.length;
|
|
1416
|
+
index += 1
|
|
1417
|
+
) {
|
|
1318
1418
|
const metadata = this.pendingConnectionMetadata[index];
|
|
1319
1419
|
if (metadata === undefined) continue;
|
|
1320
1420
|
if (streamMonitorEndpointKey(metadata.localAddr, metadata.remoteAddr) === endpointKey) {
|
|
@@ -1325,7 +1425,9 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1325
1425
|
this.compactPendingConnectionMetadata();
|
|
1326
1426
|
}
|
|
1327
1427
|
|
|
1328
|
-
private resolveMonitorSession(
|
|
1428
|
+
private resolveMonitorSession(
|
|
1429
|
+
event: ZLinkBackendSocketMonitorEvent
|
|
1430
|
+
): ZLinkStreamSessionRuntime | undefined {
|
|
1329
1431
|
if (event.routingId !== undefined) {
|
|
1330
1432
|
const session = this.getActiveSession(streamSessionIdFromRoutingId(event.routingId));
|
|
1331
1433
|
if (session !== undefined) {
|
|
@@ -1336,9 +1438,11 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1336
1438
|
let match: ZLinkStreamSessionRuntime | undefined;
|
|
1337
1439
|
let matchCount = 0;
|
|
1338
1440
|
for (const session of this.sessions.values()) {
|
|
1339
|
-
if (
|
|
1340
|
-
|
|
1341
|
-
|
|
1441
|
+
if (
|
|
1442
|
+
session.isDisconnected ||
|
|
1443
|
+
session.stream.localAddr !== event.localAddr ||
|
|
1444
|
+
session.stream.remoteAddr !== event.remoteAddr
|
|
1445
|
+
) {
|
|
1342
1446
|
continue;
|
|
1343
1447
|
}
|
|
1344
1448
|
match = session;
|
|
@@ -1382,11 +1486,11 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1382
1486
|
this.wakeReceiveLoop();
|
|
1383
1487
|
setImmediate(() => {
|
|
1384
1488
|
if (
|
|
1385
|
-
pending.cancelled
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1489
|
+
pending.cancelled ||
|
|
1490
|
+
this.stopped ||
|
|
1491
|
+
this.pendingEndpointlessDisconnect !== pending ||
|
|
1492
|
+
this.activityVersion !== pending.activityVersion ||
|
|
1493
|
+
this.sessions.get(pending.session.stream.sessionId) !== pending.session
|
|
1390
1494
|
) {
|
|
1391
1495
|
return;
|
|
1392
1496
|
}
|
|
@@ -1425,15 +1529,11 @@ export class ZLinkStreamSessionNodeRuntime {
|
|
|
1425
1529
|
void rejected.closeForDrain().catch((error) => this.options.onError?.(error));
|
|
1426
1530
|
return undefined;
|
|
1427
1531
|
}
|
|
1428
|
-
const created = new ZLinkStreamSessionRuntime(
|
|
1429
|
-
this.
|
|
1430
|
-
|
|
1431
|
-
(sessionId, session) => {
|
|
1432
|
-
if (this.sessions.get(sessionId) === session) {
|
|
1433
|
-
this.sessions.delete(sessionId);
|
|
1434
|
-
}
|
|
1532
|
+
const created = new ZLinkStreamSessionRuntime(this.options, routingId, (sessionId, session) => {
|
|
1533
|
+
if (this.sessions.get(sessionId) === session) {
|
|
1534
|
+
this.sessions.delete(sessionId);
|
|
1435
1535
|
}
|
|
1436
|
-
);
|
|
1536
|
+
});
|
|
1437
1537
|
this.sessions.set(sessionId, created);
|
|
1438
1538
|
return created;
|
|
1439
1539
|
}
|
|
@@ -1444,7 +1544,10 @@ function monitorIdleDelayMs(misses: number): number {
|
|
|
1444
1544
|
return Math.min(scaled, ZLINK_STREAM_MONITOR_IDLE_MAX_DELAY_MS);
|
|
1445
1545
|
}
|
|
1446
1546
|
|
|
1447
|
-
function streamMonitorEndpointKey(
|
|
1547
|
+
function streamMonitorEndpointKey(
|
|
1548
|
+
localAddr: string | undefined,
|
|
1549
|
+
remoteAddr: string | undefined
|
|
1550
|
+
): string {
|
|
1448
1551
|
return `${localAddr ?? ''}\n${remoteAddr ?? ''}`;
|
|
1449
1552
|
}
|
|
1450
1553
|
|