@zlink-systems/framework 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
- package/dist/contracts/Common/CoreTypes.d.ts +6 -0
- package/dist/contracts/Common/CoreTypes.js +7 -0
- package/dist/contracts/Common/index.d.ts +1 -1
- package/dist/contracts/Common/index.js +0 -1
- package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
- package/dist/contracts/Configuration/InternalDefaults.js +9 -1
- package/dist/contracts/Configuration/Registration.d.ts +13 -2
- package/dist/contracts/Configuration/Registration.js +58 -36
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
- package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
- package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
- package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
- package/dist/contracts/Handlers/JsonContract.js +10 -4
- package/dist/contracts/Locations/Authority.d.ts +1 -1
- package/dist/contracts/Locations/Authority.js +3 -2
- package/dist/contracts/Locations/Options.js +1 -1
- package/dist/contracts/Locations/Stores.d.ts +12 -0
- package/dist/contracts/Locations/Stores.js +9 -0
- package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
- package/dist/contracts/Spots/Contracts.d.ts +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +16 -1
- package/dist/nest-integration.d.ts +4 -2
- package/dist/nest-integration.js +14 -4
- package/dist/runtime/abort.d.ts +1 -0
- package/dist/runtime/abort.js +8 -5
- package/dist/runtime/activation-admission.d.ts +28 -0
- package/dist/runtime/activation-admission.js +57 -0
- package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
- package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
- package/dist/runtime/actors/actor-client.d.ts +2 -2
- package/dist/runtime/actors/actor-client.js +42 -143
- package/dist/runtime/actors/actor-context.d.ts +3 -5
- package/dist/runtime/actors/actor-context.js +19 -17
- package/dist/runtime/actors/actor-handoff.d.ts +13 -7
- package/dist/runtime/actors/actor-handoff.js +36 -25
- package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
- package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
- package/dist/runtime/actors/actor-local-native-join.js +85 -123
- package/dist/runtime/actors/actor-native-lookup.js +2 -8
- package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
- package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
- package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
- package/dist/runtime/actors/actor-remote-joiner.js +11 -17
- package/dist/runtime/actors/actor-remote-wire.js +5 -3
- package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
- package/dist/runtime/actors/actor-request-deadline.js +31 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
- package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
- package/dist/runtime/actors/actor-runtime-state.js +70 -187
- package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
- package/dist/runtime/actors/bound-session-wire.js +2 -7
- package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
- package/dist/runtime/actors/deferred-join-completion.js +21 -0
- package/dist/runtime/actors/index.d.ts +10 -8
- package/dist/runtime/actors/index.js +101 -73
- package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
- package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
- package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
- package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
- package/dist/runtime/admission.d.ts +7 -1
- package/dist/runtime/admission.js +11 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
- package/dist/runtime/backend/contracts/index.d.ts +8 -33
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
- package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
- package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
- package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
- package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
- package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
- package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
- package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
- package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
- package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
- package/dist/runtime/backend/runtime-values.d.ts +4 -1
- package/dist/runtime/backend/runtime-values.js +2 -0
- package/dist/runtime/channels/channel-clients.d.ts +20 -9
- package/dist/runtime/channels/channel-clients.js +68 -60
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.js +47 -29
- package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
- package/dist/runtime/channels/channel-outbound-operations.js +9 -18
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
- package/dist/runtime/channels/channel-runtime-manager.js +4 -12
- package/dist/runtime/channels/channel-socket-options.js +3 -2
- package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
- package/dist/runtime/channels/channel-socket-registry.js +296 -235
- package/dist/runtime/channels/channel-transports.d.ts +11 -20
- package/dist/runtime/channels/channel-transports.js +68 -47
- package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/client-server-location-runtime.js +10 -11
- package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
- package/dist/runtime/channels/client-server-service-wire.js +32 -11
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
- package/dist/runtime/channels/fanout-location-runtime.js +133 -81
- package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
- package/dist/runtime/channels/spot-direct-envelope.js +4 -3
- package/dist/runtime/channels/spot-node-route-transport.js +3 -2
- package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
- package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
- package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
- package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
- package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
- package/dist/runtime/diagnostics/flow-context.js +16 -2
- package/dist/runtime/diagnostics/index.d.ts +4 -2
- package/dist/runtime/diagnostics/index.js +14 -4
- package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
- package/dist/runtime/diagnostics/message-flow.js +10 -19
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
- package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
- package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
- package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
- package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
- package/dist/runtime/disposal.d.ts +5 -0
- package/dist/runtime/disposal.js +22 -0
- package/dist/runtime/execution/index.d.ts +22 -9
- package/dist/runtime/execution/index.js +107 -37
- package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
- package/dist/runtime/execution/serial-execution-queue.js +99 -26
- package/dist/runtime/execution/state-lane.d.ts +8 -1
- package/dist/runtime/execution/state-lane.js +118 -3
- package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
- package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
- package/dist/runtime/foundation/event-loop-resources.js +6 -119
- package/dist/runtime/foundation/listener-records.d.ts +11 -0
- package/dist/runtime/foundation/listener-records.js +20 -0
- package/dist/runtime/foundation/operation-identity.d.ts +2 -0
- package/dist/runtime/foundation/operation-identity.js +9 -5
- package/dist/runtime/foundation/operation-registry.d.ts +5 -7
- package/dist/runtime/foundation/operation-registry.js +34 -44
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
- package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
- package/dist/runtime/foundation/runtime-state-projections.js +8 -0
- package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
- package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
- package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
- package/dist/runtime/foundation/service-discovery-registry.js +22 -3
- package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
- package/dist/runtime/foundation/service-liveness-registry.js +2 -1
- package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
- package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
- package/dist/runtime/foundation/service-metadata-codec.js +3 -3
- package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
- package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
- package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
- package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
- package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
- package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
- package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
- package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
- package/dist/runtime/foundation/service-stateful-registry.js +10 -2
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
- package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
- package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
- package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
- package/dist/runtime/foundation/service-topology-registry.js +22 -61
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
- package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
- package/dist/runtime/foundation/service-wire-codec.js +10 -8
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
- package/dist/runtime/framework-errors-internal.d.ts +2 -1
- package/dist/runtime/framework-errors-internal.js +343 -122
- package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
- package/dist/runtime/handlers/handler-instance-scope.js +61 -74
- package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
- package/dist/runtime/host/actor-packet-relay.js +48 -91
- package/dist/runtime/host/actor-placement-coordinator.js +7 -5
- package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
- package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
- package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
- package/dist/runtime/host/actor-transfer-runtime.js +210 -256
- package/dist/runtime/host/application-job-queue.js +16 -33
- package/dist/runtime/host/bound-session-relay.js +1 -1
- package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
- package/dist/runtime/host/index.d.ts +19 -14
- package/dist/runtime/host/index.js +234 -175
- package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
- package/dist/runtime/host/instance-activation-authority.js +17 -45
- package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
- package/dist/runtime/host/location-runtime-owner.js +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
- package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
- package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
- package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
- package/dist/runtime/host/remote-bound-session-relay.js +11 -23
- package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
- package/dist/runtime/host/route-mesh-runtime.js +178 -257
- package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
- package/dist/runtime/host/runtime-shutdown.js +18 -21
- package/dist/runtime/host/service-relocation-control.js +6 -1
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
- package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
- package/dist/runtime/host/spot-address-transport.d.ts +2 -3
- package/dist/runtime/host/spot-address-transport.js +34 -136
- package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
- package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
- package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
- package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
- package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
- package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
- package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
- package/dist/runtime/locations/authority-key-codec.js +4 -3
- package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
- package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
- package/dist/runtime/locations/creation-operation-id.js +6 -4
- package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
- package/dist/runtime/locations/in-memory-authority-store.js +31 -15
- package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
- package/dist/runtime/locations/in-memory-location-store.js +17 -14
- package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
- package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
- package/dist/runtime/locations/key-codec.js +3 -2
- package/dist/runtime/locations/lease-tracker.d.ts +3 -5
- package/dist/runtime/locations/lease-tracker.js +7 -11
- package/dist/runtime/locations/lifecycle.d.ts +5 -10
- package/dist/runtime/locations/lifecycle.js +4 -33
- package/dist/runtime/locations/location-store-failure.d.ts +2 -0
- package/dist/runtime/locations/location-store-failure.js +7 -0
- package/dist/runtime/locations/location-store-pages.d.ts +3 -0
- package/dist/runtime/locations/location-store-pages.js +13 -0
- package/dist/runtime/locations/location-store-repository.d.ts +5 -7
- package/dist/runtime/locations/location-store-repository.js +303 -332
- package/dist/runtime/locations/relocation-blob.js +18 -5
- package/dist/runtime/locations/resolvers.d.ts +5 -5
- package/dist/runtime/locations/resolvers.js +44 -30
- package/dist/runtime/locations/runtime.d.ts +5 -4
- package/dist/runtime/locations/runtime.js +123 -92
- package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
- package/dist/runtime/locations/spot-location-claims.js +40 -23
- package/dist/runtime/messaging/payload-codec.js +26 -20
- package/dist/runtime/messaging/submission-result.d.ts +3 -0
- package/dist/runtime/messaging/submission-result.js +48 -0
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
- package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
- package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
- package/dist/runtime/spots/index.d.ts +29 -29
- package/dist/runtime/spots/index.js +441 -313
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
- package/dist/runtime/spots/spot-activation-registry.js +27 -60
- package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
- package/dist/runtime/spots/spot-activation-state.js +4 -17
- package/dist/runtime/spots/spot-activation.d.ts +10 -9
- package/dist/runtime/spots/spot-activation.js +103 -81
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
- package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
- package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
- package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
- package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
- package/dist/runtime/spots/spot-actor-membership.js +44 -53
- package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
- package/dist/runtime/spots/spot-context.d.ts +2 -2
- package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
- package/dist/runtime/spots/spot-entry-activation.js +9 -21
- package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
- package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
- package/dist/runtime/spots/spot-manager-public.js +6 -5
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
- package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
- package/dist/runtime/spots/spot-outbound.d.ts +4 -3
- package/dist/runtime/spots/spot-outbound.js +10 -37
- package/dist/runtime/spots/spot-remote-codec.js +5 -3
- package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
- package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
- package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
- package/dist/runtime/spots/spot-route-replies.js +3 -1
- package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
- package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
- package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
- package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
- package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
- package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
- package/dist/runtime/spots/spot-serial-executor.js +9 -2
- package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
- package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
- package/dist/runtime/spots/spot-timer.d.ts +3 -2
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
- package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
- package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -19
- package/dist/runtime/streams/index.d.ts +15 -14
- package/dist/runtime/streams/index.js +38 -39
- package/dist/runtime/streams/managed-stream.d.ts +3 -0
- package/dist/runtime/streams/managed-stream.js +17 -8
- package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
- package/dist/runtime/streams/protocol.d.ts +6 -33
- package/dist/runtime/streams/protocol.js +38 -110
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
- package/dist/runtime/streams/session-actor-coordinator.js +12 -4
- package/dist/runtime/streams/session-calls.d.ts +1 -1
- package/dist/runtime/streams/session-calls.js +5 -4
- package/dist/runtime/streams/session-context.d.ts +6 -6
- package/dist/runtime/streams/session-context.js +22 -4
- package/dist/runtime/streams/session-requests.js +2 -1
- package/dist/runtime/streams/session-serial-executor.js +2 -2
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
- package/dist/runtime/streams/stream-frame-factory.js +2 -2
- package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
- package/dist/runtime/streams/stream-session-runtime.js +25 -33
- package/dist/runtime/workers/index.d.ts +2 -2
- package/dist/runtime/workers/index.js +5 -4
- package/package.json +3 -3
- package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/InternalDefaults.ts +12 -0
- package/src/contracts/Configuration/Registration.ts +92 -48
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
- package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
- package/src/contracts/Handlers/JsonContract.ts +14 -4
- package/src/contracts/Locations/Authority.ts +7 -3
- package/src/contracts/Locations/Options.ts +1 -1
- package/src/contracts/Locations/Stores.ts +14 -0
- package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
- package/src/contracts/Spots/Contracts.ts +1 -1
- package/src/internal.ts +15 -0
- package/src/nest-integration.ts +28 -10
- package/src/runtime/abort.ts +6 -5
- package/src/runtime/activation-admission.ts +72 -0
- package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
- package/src/runtime/actors/actor-client.ts +77 -204
- package/src/runtime/actors/actor-context.ts +45 -39
- package/src/runtime/actors/actor-handoff.ts +55 -45
- package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
- package/src/runtime/actors/actor-local-native-join.ts +174 -215
- package/src/runtime/actors/actor-native-lookup.ts +2 -9
- package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
- package/src/runtime/actors/actor-remote-joiner.ts +15 -36
- package/src/runtime/actors/actor-remote-wire.ts +5 -3
- package/src/runtime/actors/actor-request-deadline.ts +49 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
- package/src/runtime/actors/actor-runtime-state.ts +85 -247
- package/src/runtime/actors/actor-source-transfer.ts +5 -18
- package/src/runtime/actors/bound-session-wire.ts +2 -8
- package/src/runtime/actors/deferred-join-completion.ts +44 -0
- package/src/runtime/actors/index.ts +122 -88
- package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
- package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
- package/src/runtime/admission.ts +13 -2
- package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
- package/src/runtime/backend/contracts/index.ts +15 -42
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
- package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
- package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
- package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
- package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
- package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
- package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
- package/src/runtime/backend/raw-binding-port.ts +14 -1
- package/src/runtime/backend/runtime-values.ts +4 -1
- package/src/runtime/channels/channel-clients.ts +132 -96
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +58 -29
- package/src/runtime/channels/channel-outbound-operations.ts +10 -31
- package/src/runtime/channels/channel-receive-loops.ts +39 -7
- package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
- package/src/runtime/channels/channel-runtime-manager.ts +8 -15
- package/src/runtime/channels/channel-socket-options.ts +8 -2
- package/src/runtime/channels/channel-socket-registry.ts +369 -262
- package/src/runtime/channels/channel-transports.ts +161 -115
- package/src/runtime/channels/client-server-location-runtime.ts +17 -17
- package/src/runtime/channels/client-server-service-wire.ts +40 -12
- package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
- package/src/runtime/channels/fanout-location-runtime.ts +175 -106
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +5 -2
- package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
- package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
- package/src/runtime/diagnostics/flow-context.ts +16 -2
- package/src/runtime/diagnostics/index.ts +27 -17
- package/src/runtime/diagnostics/message-flow.ts +15 -25
- package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
- package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
- package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
- package/src/runtime/disposal.ts +19 -0
- package/src/runtime/execution/index.ts +116 -38
- package/src/runtime/execution/serial-execution-queue.ts +179 -34
- package/src/runtime/execution/state-lane.ts +142 -4
- package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
- package/src/runtime/foundation/event-loop-resources.ts +5 -122
- package/src/runtime/foundation/listener-records.ts +21 -0
- package/src/runtime/foundation/operation-identity.ts +11 -5
- package/src/runtime/foundation/operation-registry.ts +33 -50
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
- package/src/runtime/foundation/runtime-state-projections.ts +9 -1
- package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
- package/src/runtime/foundation/service-discovery-registry.ts +32 -3
- package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
- package/src/runtime/foundation/service-liveness-registry.ts +2 -1
- package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
- package/src/runtime/foundation/service-metadata-codec.ts +2 -2
- package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
- package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
- package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
- package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
- package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
- package/src/runtime/foundation/service-stateful-registry.ts +14 -2
- package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
- package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
- package/src/runtime/foundation/service-topology-registry.ts +30 -79
- package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
- package/src/runtime/foundation/service-wire-codec.ts +15 -8
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
- package/src/runtime/framework-errors-internal.ts +380 -134
- package/src/runtime/handlers/handler-instance-scope.ts +68 -95
- package/src/runtime/host/actor-packet-relay.ts +57 -147
- package/src/runtime/host/actor-placement-coordinator.ts +8 -5
- package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
- package/src/runtime/host/actor-transfer-runtime.ts +266 -418
- package/src/runtime/host/application-job-queue.ts +28 -34
- package/src/runtime/host/bound-session-relay.ts +1 -2
- package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
- package/src/runtime/host/index.ts +408 -312
- package/src/runtime/host/instance-activation-authority.ts +89 -109
- package/src/runtime/host/location-runtime-owner.ts +4 -2
- package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
- package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
- package/src/runtime/host/remote-bound-session-relay.ts +12 -44
- package/src/runtime/host/route-mesh-runtime.ts +236 -275
- package/src/runtime/host/runtime-shutdown.ts +17 -21
- package/src/runtime/host/service-relocation-control.ts +14 -1
- package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
- package/src/runtime/host/spot-address-transport.ts +73 -195
- package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
- package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
- package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
- package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
- package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
- package/src/runtime/locations/authority-key-codec.ts +7 -3
- package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
- package/src/runtime/locations/creation-operation-id.ts +6 -3
- package/src/runtime/locations/domain-store-contract.ts +12 -3
- package/src/runtime/locations/in-memory-authority-store.ts +44 -15
- package/src/runtime/locations/in-memory-location-store.ts +50 -39
- package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
- package/src/runtime/locations/key-codec.ts +3 -2
- package/src/runtime/locations/lease-tracker.ts +8 -14
- package/src/runtime/locations/lifecycle.ts +16 -45
- package/src/runtime/locations/location-store-failure.ts +4 -0
- package/src/runtime/locations/location-store-pages.ts +18 -0
- package/src/runtime/locations/location-store-repository.ts +450 -478
- package/src/runtime/locations/relocation-blob.ts +17 -6
- package/src/runtime/locations/resolvers.ts +90 -58
- package/src/runtime/locations/runtime.ts +220 -110
- package/src/runtime/locations/spot-location-claims.ts +54 -26
- package/src/runtime/messaging/payload-codec.ts +35 -24
- package/src/runtime/messaging/submission-result.ts +57 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
- package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
- package/src/runtime/spots/index.ts +687 -437
- package/src/runtime/spots/spot-activation-registry.ts +42 -71
- package/src/runtime/spots/spot-activation-state.ts +4 -16
- package/src/runtime/spots/spot-activation.ts +167 -115
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
- package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
- package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
- package/src/runtime/spots/spot-actor-membership.ts +107 -75
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
- package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
- package/src/runtime/spots/spot-context.ts +3 -3
- package/src/runtime/spots/spot-entry-activation.ts +13 -33
- package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
- package/src/runtime/spots/spot-manager-public.ts +29 -21
- package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
- package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
- package/src/runtime/spots/spot-outbound.ts +47 -68
- package/src/runtime/spots/spot-remote-codec.ts +7 -3
- package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
- package/src/runtime/spots/spot-route-replies.ts +6 -4
- package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
- package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
- package/src/runtime/spots/spot-runtime-ports.ts +10 -43
- package/src/runtime/spots/spot-serial-executor.ts +10 -2
- package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
- package/src/runtime/spots/spot-timer.ts +3 -2
- package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
- package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
- package/src/runtime/streams/bound-session-service.ts +23 -37
- package/src/runtime/streams/index.ts +102 -88
- package/src/runtime/streams/managed-stream.ts +29 -10
- package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
- package/src/runtime/streams/protocol.ts +34 -88
- package/src/runtime/streams/session-actor-coordinator.ts +17 -5
- package/src/runtime/streams/session-calls.ts +6 -5
- package/src/runtime/streams/session-context.ts +54 -10
- package/src/runtime/streams/session-requests.ts +2 -1
- package/src/runtime/streams/session-serial-executor.ts +2 -2
- package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
- package/src/runtime/streams/stream-frame-factory.ts +2 -3
- package/src/runtime/streams/stream-session-runtime.ts +57 -59
- package/src/runtime/workers/index.ts +13 -12
- package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
- package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
- package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
- package/dist/runtime/actors/post-commit-actor-location.js +0 -72
- package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
- package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
- package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
- package/src/runtime/actors/post-commit-actor-location.ts +0 -121
- package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { ZLINK_DEFAULT_PUBLIC_WEIGHT } from '../../../contracts/Configuration/RegistrationBuilderPolicy';
|
|
1
2
|
import type { Socket } from '@zlink-systems/zlink';
|
|
2
3
|
import type { ZLinkBackendObject } from '../contracts';
|
|
3
4
|
import {
|
|
4
|
-
|
|
5
|
+
closeBindingHandle,
|
|
5
6
|
disableSocketLinger,
|
|
6
7
|
isBindingNotFound,
|
|
7
8
|
isContextTerminatedError,
|
|
@@ -52,7 +53,7 @@ export function wrapSocket<T extends { close(): void }>(
|
|
|
52
53
|
async dispose(): Promise<void> {
|
|
53
54
|
eventLoopPoller?.dispose();
|
|
54
55
|
disableSocketLinger(nativeInstance);
|
|
55
|
-
|
|
56
|
+
closeBindingHandle(nativeInstance);
|
|
56
57
|
},
|
|
57
58
|
close(): void {
|
|
58
59
|
eventLoopPoller?.dispose();
|
|
@@ -114,7 +115,7 @@ export function wrapSocket<T extends { close(): void }>(
|
|
|
114
115
|
);
|
|
115
116
|
},
|
|
116
117
|
get peerWeight(): number {
|
|
117
|
-
return socket.options?.peerWeight ??
|
|
118
|
+
return socket.options?.peerWeight ?? ZLINK_DEFAULT_PUBLIC_WEIGHT;
|
|
118
119
|
},
|
|
119
120
|
set peerWeight(value: number) {
|
|
120
121
|
requireSocketOptions(socket).peerWeight = value;
|
|
@@ -381,7 +382,7 @@ export function isEndpointCloseIgnorableError(error: unknown): boolean {
|
|
|
381
382
|
isContextTerminatedError(error) ||
|
|
382
383
|
(error instanceof Error &&
|
|
383
384
|
'code' in error &&
|
|
384
|
-
((error as { code: unknown }).code ===
|
|
385
|
+
((error as { code: unknown }).code === zlink.ConnectResult.InternalError ||
|
|
385
386
|
(error as { code: unknown }).code === zlink.ConnectResult.NotFound))
|
|
386
387
|
);
|
|
387
388
|
}
|
|
@@ -2,6 +2,11 @@ export interface ZLinkRawReceivedRecord {
|
|
|
2
2
|
readonly sourceRid: string;
|
|
3
3
|
readonly sourceRoute: Uint8Array;
|
|
4
4
|
readonly requestSeq?: bigint;
|
|
5
|
+
/**
|
|
6
|
+
* Core selected-route generation of the ROUTER route that delivered this
|
|
7
|
+
* record (Core ROUTER §10.1); 0n for a non-ROUTER receive. Equality only.
|
|
8
|
+
*/
|
|
9
|
+
readonly routeGeneration: bigint;
|
|
5
10
|
readonly reply?: (parts: readonly Uint8Array[]) => void;
|
|
6
11
|
readonly parts: readonly Buffer[];
|
|
7
12
|
/** Releases the ordinary Framework-owned receive record exactly once. */
|
|
@@ -21,7 +26,7 @@ export interface ZLinkRawMonitorRecord {
|
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
export interface ZLinkRawSocketPort {
|
|
24
|
-
setReadableHandler(handler: () => void): void;
|
|
29
|
+
setReadableHandler(handler: (receiveReady: boolean, routeReady: boolean) => void): void;
|
|
25
30
|
bind(endpoint: string): void;
|
|
26
31
|
unbind(endpoint: string): void;
|
|
27
32
|
connect(endpoint: string): void;
|
|
@@ -37,6 +42,12 @@ export interface ZLinkRawMonitorPort {
|
|
|
37
42
|
close(): void;
|
|
38
43
|
}
|
|
39
44
|
|
|
45
|
+
/** One row of the ROUTER selected-route snapshot (Core ROUTER §10.1). */
|
|
46
|
+
export interface ZLinkRawRouterRoute {
|
|
47
|
+
readonly routingId: string;
|
|
48
|
+
readonly routeGeneration: bigint;
|
|
49
|
+
}
|
|
50
|
+
|
|
40
51
|
export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
|
|
41
52
|
disconnectRid?(routingId: string): void;
|
|
42
53
|
localEndpoint(): string;
|
|
@@ -49,6 +60,8 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
|
|
|
49
60
|
timeoutMs: number
|
|
50
61
|
): Promise<readonly Buffer[]>;
|
|
51
62
|
receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
|
|
63
|
+
/** The selected route of every RID. The socket's one route observer calls it. */
|
|
64
|
+
routesSnapshot(): readonly ZLinkRawRouterRoute[];
|
|
52
65
|
}
|
|
53
66
|
|
|
54
67
|
export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
|
|
@@ -46,11 +46,14 @@ export class ZLinkBackendResultError extends Error {
|
|
|
46
46
|
readonly operation: 'request' | 'submit',
|
|
47
47
|
readonly result: number,
|
|
48
48
|
readonly nativeErrno?: number,
|
|
49
|
-
options?: ErrorOptions
|
|
49
|
+
options?: ErrorOptions & { readonly phase?: 'submit' | 'completion' }
|
|
50
50
|
) {
|
|
51
51
|
super(`Backend ${operation} failed with result ${result}.`, options);
|
|
52
52
|
this.name = 'ZLinkBackendResultError';
|
|
53
|
+
this.phase = options?.phase ?? 'completion';
|
|
53
54
|
}
|
|
55
|
+
|
|
56
|
+
readonly phase: 'submit' | 'completion';
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
export function isZLinkBackendResultError(error: unknown): error is ZLinkBackendResultError {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_REQUEST_TIMEOUT_MS } from '../../contracts/Configuration/Registration';
|
|
1
2
|
import type {
|
|
2
3
|
ZLinkChannelClient,
|
|
3
4
|
ZLinkChannelRequestCall,
|
|
@@ -43,68 +44,76 @@ import {
|
|
|
43
44
|
} from '../spots/spot-outbound';
|
|
44
45
|
import { resolveFrameworkPacketName } from '../messaging/packet-name';
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
) {}
|
|
47
|
+
type RouteMeshChannelMatch = {
|
|
48
|
+
readonly meshName: string;
|
|
49
|
+
readonly mesh: NonNullable<ReturnType<ZLinkFrameworkRegistration['spotNodes']['get']>>;
|
|
50
|
+
};
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
52
|
+
type ChannelRouteResolution =
|
|
53
|
+
| {
|
|
54
|
+
readonly kind: 'client-server';
|
|
55
|
+
readonly channel: NonNullable<ReturnType<ZLinkFrameworkRegistration['channels']['get']>>;
|
|
56
|
+
}
|
|
57
|
+
| { readonly kind: 'route-mesh'; readonly matches: readonly RouteMeshChannelMatch[] };
|
|
58
|
+
|
|
59
|
+
type ResolvedChannelRoute =
|
|
60
|
+
| Extract<ChannelRouteResolution, { readonly kind: 'client-server' }>
|
|
61
|
+
| {
|
|
62
|
+
readonly kind: 'route-mesh';
|
|
63
|
+
readonly meshName: string;
|
|
64
|
+
readonly mesh: RouteMeshChannelMatch['mesh'];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export function resolveChannelRoute(
|
|
68
|
+
registration: ZLinkFrameworkRegistration,
|
|
69
|
+
channelName: string
|
|
70
|
+
): ChannelRouteResolution | undefined {
|
|
71
|
+
const clientServerChannel = registration.channels.get(channelName);
|
|
72
|
+
if (clientServerChannel !== undefined) {
|
|
73
|
+
return { kind: 'client-server', channel: clientServerChannel };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const matches = [...registration.spotNodes.entries()]
|
|
77
|
+
.filter(([, mesh]) =>
|
|
78
|
+
Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
|
|
79
|
+
)
|
|
80
|
+
.map(([meshName, mesh]) => ({ meshName, mesh }));
|
|
81
|
+
return matches.length === 0 ? undefined : { kind: 'route-mesh', matches };
|
|
82
|
+
}
|
|
61
83
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
packetName,
|
|
69
|
-
request,
|
|
70
|
-
timeoutMs,
|
|
71
|
-
signal,
|
|
72
|
-
metadata
|
|
73
|
-
),
|
|
74
|
-
this.defaultRequestTimeout(channelName)
|
|
75
|
-
);
|
|
84
|
+
export function requireUniqueRouteMeshChannel(
|
|
85
|
+
matches: readonly RouteMeshChannelMatch[],
|
|
86
|
+
duplicateMessage: string
|
|
87
|
+
): RouteMeshChannelMatch {
|
|
88
|
+
if (matches.length !== 1) {
|
|
89
|
+
throw new ZLinkConfigurationException(duplicateMessage);
|
|
76
90
|
}
|
|
91
|
+
return matches[0]!;
|
|
92
|
+
}
|
|
77
93
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
export class DefaultZLinkChannelClient implements ZLinkChannelClient {
|
|
95
|
+
private readonly routeClient: DefaultZLinkRouteClient;
|
|
96
|
+
|
|
97
|
+
constructor(
|
|
98
|
+
registration: ZLinkFrameworkRegistration,
|
|
99
|
+
channelTransport?: ZLinkChannelClientTransportSource,
|
|
100
|
+
routeTransport?: ZLinkRouteClientTransport,
|
|
101
|
+
spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) => meshName
|
|
102
|
+
) {
|
|
103
|
+
this.routeClient = new DefaultZLinkRouteClient(
|
|
104
|
+
registration,
|
|
105
|
+
routeTransport,
|
|
106
|
+
spotRouterChannelIdForMesh,
|
|
107
|
+
channelTransport
|
|
83
108
|
);
|
|
84
109
|
}
|
|
85
110
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (channel === undefined) {
|
|
89
|
-
throw createInternalFrameworkException(
|
|
90
|
-
ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
|
|
91
|
-
`Channel client '${channelName}' is not registered.`
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (channel.client === undefined) {
|
|
95
|
-
throw createInternalFrameworkException(
|
|
96
|
-
ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
|
|
97
|
-
`Channel client role '${channelName}' is not configured.`
|
|
98
|
-
);
|
|
99
|
-
}
|
|
111
|
+
sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
|
|
112
|
+
return this.routeClient.sendToChannel(channelName, message);
|
|
100
113
|
}
|
|
101
114
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (transport === undefined) {
|
|
105
|
-
throw new ZLinkConfigurationException('Channel runtime is not started.');
|
|
106
|
-
}
|
|
107
|
-
return transport;
|
|
115
|
+
requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
|
|
116
|
+
return this.routeClient.requestToChannel(channelName, request);
|
|
108
117
|
}
|
|
109
118
|
}
|
|
110
119
|
|
|
@@ -138,17 +147,6 @@ export class DefaultZLinkFanoutClient implements ZLinkFanoutClient {
|
|
|
138
147
|
);
|
|
139
148
|
}
|
|
140
149
|
|
|
141
|
-
getListenerStatus(channelName: string): import('../../contracts').ZLinkFanoutListenerStatus {
|
|
142
|
-
this.requirePublisherChannel(channelName);
|
|
143
|
-
const status = this.requireTransport().getFanoutListenerStatus?.(channelName);
|
|
144
|
-
if (status === undefined) {
|
|
145
|
-
throw new ZLinkConfigurationException(
|
|
146
|
-
`Fanout publisher '${channelName}' has not reported a bound listener.`
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
return status;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
150
|
private requirePublisherChannel(channelName: string): void {
|
|
153
151
|
if (!this.registration.fanoutPublishers.has(channelName)) {
|
|
154
152
|
throw new ZLinkConfigurationException(
|
|
@@ -171,7 +169,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
171
169
|
private readonly registration: ZLinkFrameworkRegistration,
|
|
172
170
|
private readonly transport?: ZLinkRouteClientTransport,
|
|
173
171
|
private readonly spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) =>
|
|
174
|
-
meshName
|
|
172
|
+
meshName,
|
|
173
|
+
private readonly channelTransport?: ZLinkChannelClientTransportSource
|
|
175
174
|
) {}
|
|
176
175
|
|
|
177
176
|
sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
|
|
@@ -210,14 +209,23 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
210
209
|
|
|
211
210
|
sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
|
|
212
211
|
return new DefaultZLinkSendCall(
|
|
213
|
-
() =>
|
|
214
|
-
this.resolveMeshChannel(channelName);
|
|
215
|
-
},
|
|
212
|
+
() => this.requireChannelRoute(channelName),
|
|
216
213
|
async (packetName, metadata, signal) => {
|
|
217
|
-
const
|
|
214
|
+
const route = this.requireChannelRoute(channelName);
|
|
215
|
+
if (route.kind === 'route-mesh') {
|
|
216
|
+
return normalizeSubmitResult(
|
|
217
|
+
await this.requireTransport().submitToChannel(
|
|
218
|
+
route.meshName,
|
|
219
|
+
channelName,
|
|
220
|
+
packetName,
|
|
221
|
+
message,
|
|
222
|
+
signal,
|
|
223
|
+
metadata
|
|
224
|
+
)
|
|
225
|
+
);
|
|
226
|
+
}
|
|
218
227
|
return normalizeSubmitResult(
|
|
219
|
-
await this.
|
|
220
|
-
meshName,
|
|
228
|
+
await this.requireChannelTransport().send(
|
|
221
229
|
channelName,
|
|
222
230
|
packetName,
|
|
223
231
|
message,
|
|
@@ -231,13 +239,21 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
231
239
|
|
|
232
240
|
requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
|
|
233
241
|
return new DefaultZLinkRequestCall(
|
|
234
|
-
() =>
|
|
235
|
-
this.resolveMeshChannel(channelName);
|
|
236
|
-
},
|
|
242
|
+
() => this.requireChannelRoute(channelName),
|
|
237
243
|
(packetName, timeoutMs, metadata, signal) => {
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
const route = this.requireChannelRoute(channelName);
|
|
245
|
+
if (route.kind === 'route-mesh') {
|
|
246
|
+
return this.requireTransport().requestToChannel(
|
|
247
|
+
route.meshName,
|
|
248
|
+
channelName,
|
|
249
|
+
packetName,
|
|
250
|
+
request,
|
|
251
|
+
timeoutMs,
|
|
252
|
+
signal,
|
|
253
|
+
metadata
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
return this.requireChannelTransport().request(
|
|
241
257
|
channelName,
|
|
242
258
|
packetName,
|
|
243
259
|
request,
|
|
@@ -278,7 +294,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
278
294
|
metadata,
|
|
279
295
|
spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
|
|
280
296
|
}),
|
|
281
|
-
this.registration.requestTimeoutMs ??
|
|
297
|
+
this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
|
|
282
298
|
);
|
|
283
299
|
}
|
|
284
300
|
|
|
@@ -287,7 +303,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
287
303
|
this.registration.spotNodes.get(meshName)?.requestTimeoutMs ??
|
|
288
304
|
this.registration.routeChannelOptions.get(meshName)?.requestTimeoutMs ??
|
|
289
305
|
this.registration.requestTimeoutMs ??
|
|
290
|
-
|
|
306
|
+
DEFAULT_REQUEST_TIMEOUT_MS
|
|
291
307
|
);
|
|
292
308
|
}
|
|
293
309
|
|
|
@@ -300,31 +316,42 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
300
316
|
}
|
|
301
317
|
}
|
|
302
318
|
|
|
303
|
-
private
|
|
304
|
-
const
|
|
305
|
-
|
|
306
|
-
Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
|
|
307
|
-
)
|
|
308
|
-
.map(([meshName]) => meshName);
|
|
309
|
-
if (matches.length === 0) {
|
|
319
|
+
private requireChannelRoute(channelName: string): ResolvedChannelRoute {
|
|
320
|
+
const resolution = resolveChannelRoute(this.registration, channelName);
|
|
321
|
+
if (resolution === undefined) {
|
|
310
322
|
throw createInternalFrameworkException(
|
|
311
323
|
ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
|
|
312
|
-
`
|
|
324
|
+
`ChannelName '${channelName}' is not registered.`
|
|
313
325
|
);
|
|
314
326
|
}
|
|
315
|
-
if (
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
327
|
+
if (resolution.kind === 'client-server') {
|
|
328
|
+
if (resolution.channel.client === undefined) {
|
|
329
|
+
throw createInternalFrameworkException(
|
|
330
|
+
ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
|
|
331
|
+
`Channel client role '${channelName}' is not configured.`
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
return resolution;
|
|
319
335
|
}
|
|
320
|
-
|
|
336
|
+
|
|
337
|
+
return {
|
|
338
|
+
kind: 'route-mesh',
|
|
339
|
+
...requireUniqueRouteMeshChannel(
|
|
340
|
+
resolution.matches,
|
|
341
|
+
`RouteMesh channel '${channelName}' must be unique across the Framework host.`
|
|
342
|
+
)
|
|
343
|
+
};
|
|
321
344
|
}
|
|
322
345
|
|
|
323
346
|
private defaultRequestTimeoutForChannel(channelName: string): number {
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
347
|
+
const route = resolveChannelRoute(this.registration, channelName);
|
|
348
|
+
const timeoutMs =
|
|
349
|
+
route?.kind === 'client-server'
|
|
350
|
+
? route.channel.requestTimeoutMs
|
|
351
|
+
: route?.kind === 'route-mesh'
|
|
352
|
+
? route.matches[0]?.mesh.requestTimeoutMs
|
|
353
|
+
: undefined;
|
|
354
|
+
return timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
328
355
|
}
|
|
329
356
|
|
|
330
357
|
private requireTransport(): ZLinkRouteClientTransport {
|
|
@@ -334,6 +361,15 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
334
361
|
return this.transport;
|
|
335
362
|
}
|
|
336
363
|
|
|
364
|
+
private requireChannelTransport(): ZLinkChannelClientTransport {
|
|
365
|
+
const transport =
|
|
366
|
+
typeof this.channelTransport === 'function' ? this.channelTransport() : this.channelTransport;
|
|
367
|
+
if (transport === undefined) {
|
|
368
|
+
throw new ZLinkConfigurationException('Channel runtime is not started.');
|
|
369
|
+
}
|
|
370
|
+
return transport;
|
|
371
|
+
}
|
|
372
|
+
|
|
337
373
|
private requireSpotTransport(): ZLinkSpotRoutedTransport {
|
|
338
374
|
const transport = this.requireTransport();
|
|
339
375
|
if (transport.sendToSpot === undefined || transport.requestToSpot === undefined) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ZlinkStreamContentType } from '@zlink-systems/stream-wire';
|
|
1
2
|
import type { Message } from '../../contracts/Common/Message';
|
|
2
3
|
import type { ZLinkFlowOrigin } from '../../contracts';
|
|
3
4
|
import {
|
|
@@ -80,7 +81,7 @@ export function malformedProtocolErrorRequestHeader(
|
|
|
80
81
|
kind: ZLinkChannelMessageKind.Request,
|
|
81
82
|
channelName,
|
|
82
83
|
messageName: info.messageName ?? '',
|
|
83
|
-
contentType:
|
|
84
|
+
contentType: ZlinkStreamContentType.Json,
|
|
84
85
|
correlationId: info.correlationId ?? null,
|
|
85
86
|
deadline: null,
|
|
86
87
|
topic: null,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Message } from '../../contracts/Common/Message';
|
|
2
2
|
import type { ZLinkBackendMessageLike as MessageLike } from '../backend/runtime-values';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { isUtf8 } from 'node:buffer';
|
|
4
5
|
import {
|
|
5
6
|
ZLinkFrameworkErrorKind,
|
|
6
7
|
ZLinkFrameworkException,
|
|
@@ -20,6 +21,7 @@ import { selectSerializerWithContentType } from '../messaging/payload-codec';
|
|
|
20
21
|
import { isCanonicalCodecContentType } from '../../contracts/Configuration/CodecContentType';
|
|
21
22
|
import { parseFrameworkJsonV1, stringifyFrameworkJsonV1 } from '../messaging/framework-json-v1';
|
|
22
23
|
import { currentOrCreateFlow } from '../diagnostics/flow-context';
|
|
24
|
+
import { SERVICE_WIRE_METADATA_BYTES } from '../foundation/service-wire-constants.generated';
|
|
23
25
|
import { codecsForFrameworkPacket } from './channel-framework-packets';
|
|
24
26
|
import { readZLinkPacketJsonContract } from '../../contracts/Handlers/Attributes';
|
|
25
27
|
import type { ZLinkJsonSchema } from '../../contracts/Handlers/JsonContract';
|
|
@@ -614,7 +616,24 @@ function writeChannelHeader(
|
|
|
614
616
|
writer.append(',"source":');
|
|
615
617
|
writer.nullableString(source);
|
|
616
618
|
}
|
|
617
|
-
writer.append(',"metadata":
|
|
619
|
+
writer.append(',"metadata":');
|
|
620
|
+
writeApplicationMetadata(writer, metadata);
|
|
621
|
+
if (flowId !== undefined) {
|
|
622
|
+
writer.append(',"flowId":');
|
|
623
|
+
writer.string(flowId);
|
|
624
|
+
}
|
|
625
|
+
if (flowOrigin !== undefined) {
|
|
626
|
+
writer.append(',"flowOrigin":');
|
|
627
|
+
writer.append(String(encodeFlowOrigin(flowOrigin)));
|
|
628
|
+
}
|
|
629
|
+
writer.append('}');
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function writeApplicationMetadata(
|
|
633
|
+
writer: ChannelHeaderWriter,
|
|
634
|
+
metadata: Readonly<Record<string, string>>
|
|
635
|
+
): void {
|
|
636
|
+
writer.append('{');
|
|
618
637
|
let first = true;
|
|
619
638
|
for (const name in metadata) {
|
|
620
639
|
if (!Object.prototype.hasOwnProperty.call(metadata, name)) continue;
|
|
@@ -625,15 +644,6 @@ function writeChannelHeader(
|
|
|
625
644
|
writer.string(metadata[name]!);
|
|
626
645
|
}
|
|
627
646
|
writer.append('}');
|
|
628
|
-
if (flowId !== undefined) {
|
|
629
|
-
writer.append(',"flowId":');
|
|
630
|
-
writer.string(flowId);
|
|
631
|
-
}
|
|
632
|
-
if (flowOrigin !== undefined) {
|
|
633
|
-
writer.append(',"flowOrigin":');
|
|
634
|
-
writer.append(String(encodeFlowOrigin(flowOrigin)));
|
|
635
|
-
}
|
|
636
|
-
writer.append('}');
|
|
637
647
|
}
|
|
638
648
|
|
|
639
649
|
class ChannelHeaderWriter {
|
|
@@ -744,14 +754,20 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
|
|
|
744
754
|
}
|
|
745
755
|
|
|
746
756
|
function parseChannelHeaderBytes(payload: Buffer): unknown {
|
|
747
|
-
|
|
757
|
+
if (!isUtf8(payload)) {
|
|
758
|
+
throw new ZLinkFrameworkException(
|
|
759
|
+
ZLinkFrameworkErrorKind.ProtocolError,
|
|
760
|
+
'Channel envelope header must contain valid UTF-8.'
|
|
761
|
+
);
|
|
762
|
+
}
|
|
763
|
+
return tryParseCanonicalChannelHeader(payload) ?? parseFrameworkJsonV1(payload.toString());
|
|
748
764
|
}
|
|
749
765
|
|
|
750
766
|
/**
|
|
751
767
|
* Accept the byte layout emitted by writeChannelHeader without materializing
|
|
752
768
|
* the enclosing JSON text. Any variation falls through to the established
|
|
753
769
|
* framework-json-v1 parser, which remains the sole authority for JSON
|
|
754
|
-
* failures
|
|
770
|
+
* failures and unknown properties. Header metadata accepts every valid string key.
|
|
755
771
|
*/
|
|
756
772
|
function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown> | undefined {
|
|
757
773
|
const reader = new CanonicalChannelHeaderReader(payload);
|
|
@@ -1019,38 +1035,51 @@ const EMPTY_APPLICATION_METADATA: Readonly<Record<string, string>> = Object.free
|
|
|
1019
1035
|
function applicationMetadataRecord(
|
|
1020
1036
|
metadata: ReadonlyMap<string, string>
|
|
1021
1037
|
): Readonly<Record<string, string>> {
|
|
1022
|
-
// The common case carries no metadata; skip the record + JSON.stringify
|
|
1023
|
-
// byte-limit walk entirely.
|
|
1024
1038
|
if (metadata.size === 0) return EMPTY_APPLICATION_METADATA;
|
|
1025
|
-
const record: Record<string, string> =
|
|
1026
|
-
for (const [key, value] of metadata)
|
|
1027
|
-
|
|
1039
|
+
const record: Record<string, string> = Object.create(null) as Record<string, string>;
|
|
1040
|
+
for (const [key, value] of metadata) record[key] = value;
|
|
1041
|
+
return validateApplicationMetadata(record);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
const INVALID_METADATA_UNICODE =
|
|
1045
|
+
/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
|
|
1046
|
+
|
|
1047
|
+
function validateApplicationMetadata(
|
|
1048
|
+
metadata: Record<string, unknown>
|
|
1049
|
+
): Readonly<Record<string, string>> {
|
|
1050
|
+
const keys = Object.keys(metadata);
|
|
1051
|
+
if (keys.length === 0) return EMPTY_APPLICATION_METADATA;
|
|
1052
|
+
for (const key of keys) {
|
|
1053
|
+
const value = requireString(metadata[key], `metadata.${key}`);
|
|
1054
|
+
if (
|
|
1055
|
+
key.length === 0 ||
|
|
1056
|
+
key.includes('\0') ||
|
|
1057
|
+
value.includes('\0') ||
|
|
1058
|
+
INVALID_METADATA_UNICODE.test(key) ||
|
|
1059
|
+
INVALID_METADATA_UNICODE.test(value)
|
|
1060
|
+
) {
|
|
1028
1061
|
throw new ZLinkConfigurationException(
|
|
1029
|
-
'Channel application metadata keys must be non-empty and keys and values must
|
|
1062
|
+
'Channel application metadata keys must be non-empty and keys and values must be valid Unicode without NUL.'
|
|
1030
1063
|
);
|
|
1031
1064
|
}
|
|
1032
|
-
record[key] = value;
|
|
1033
1065
|
}
|
|
1034
|
-
|
|
1066
|
+
const record = metadata as Record<string, string>;
|
|
1067
|
+
const writer = new ChannelHeaderWriter();
|
|
1068
|
+
writeApplicationMetadata(writer, record);
|
|
1069
|
+
if (writer.byteLength > SERVICE_WIRE_METADATA_BYTES) {
|
|
1035
1070
|
throw new ZLinkConfigurationException(
|
|
1036
|
-
|
|
1071
|
+
`Channel application metadata exceeds the ${SERVICE_WIRE_METADATA_BYTES}-byte limit.`
|
|
1037
1072
|
);
|
|
1038
1073
|
}
|
|
1039
1074
|
return Object.freeze(record);
|
|
1040
1075
|
}
|
|
1041
1076
|
|
|
1042
1077
|
function requireApplicationMetadata(value: unknown): Readonly<Record<string, string>> {
|
|
1043
|
-
if (value === undefined)
|
|
1044
|
-
return Object.freeze({});
|
|
1045
|
-
}
|
|
1078
|
+
if (value === undefined) return EMPTY_APPLICATION_METADATA;
|
|
1046
1079
|
if (!isRecord(value)) {
|
|
1047
1080
|
throw new ZLinkConfigurationException('Channel application metadata must be a JSON object.');
|
|
1048
1081
|
}
|
|
1049
|
-
|
|
1050
|
-
for (const [key, selectedValue] of Object.entries(value)) {
|
|
1051
|
-
metadata.set(key, requireString(selectedValue, `metadata.${key}`));
|
|
1052
|
-
}
|
|
1053
|
-
return applicationMetadataRecord(metadata);
|
|
1082
|
+
return validateApplicationMetadata(value);
|
|
1054
1083
|
}
|
|
1055
1084
|
|
|
1056
1085
|
function optionalFlowId(value: unknown): string | undefined {
|
|
@@ -72,11 +72,7 @@ export class ZLinkChannelOutboundOperations {
|
|
|
72
72
|
throwIfAborted(signal);
|
|
73
73
|
const dealer = await this.sockets.awaitClientDealerForOutbound(channelName, signal);
|
|
74
74
|
if (dealer === undefined) {
|
|
75
|
-
return {
|
|
76
|
-
status: this.sockets.hasKnownClientServerTargets(channelName)
|
|
77
|
-
? ZLinkSubmitStatus.RouteNotConnected
|
|
78
|
-
: ZLinkSubmitStatus.TargetNotFound
|
|
79
|
-
};
|
|
75
|
+
return { status: ZLinkSubmitStatus.TimedOut };
|
|
80
76
|
}
|
|
81
77
|
const parts = encodeChannelEnvelopeParts(
|
|
82
78
|
ZLinkChannelMessageKind.Command,
|
|
@@ -155,7 +151,6 @@ export class ZLinkChannelOutboundOperations {
|
|
|
155
151
|
signal?: AbortSignal,
|
|
156
152
|
metadata?: ReadonlyMap<string, string>
|
|
157
153
|
): Promise<TReply> {
|
|
158
|
-
const deadlineAtMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
|
|
159
154
|
let correlationId: string | undefined;
|
|
160
155
|
let selectedServerRid: string | undefined;
|
|
161
156
|
let terminalRecorded = false;
|
|
@@ -175,22 +170,11 @@ export class ZLinkChannelOutboundOperations {
|
|
|
175
170
|
};
|
|
176
171
|
try {
|
|
177
172
|
throwIfAborted(signal);
|
|
178
|
-
const dealer = await this.sockets.awaitClientDealerForOutbound(
|
|
179
|
-
|
|
180
|
-
signal,
|
|
181
|
-
deadlineAtMs
|
|
182
|
-
);
|
|
183
|
-
// Binding timeouts are whole milliseconds; rounding down keeps the call's deadline.
|
|
184
|
-
const remainingMs =
|
|
185
|
-
deadlineAtMs === undefined ? undefined : Math.floor(deadlineAtMs - performance.now());
|
|
186
|
-
if (dealer === undefined || (remainingMs !== undefined && remainingMs <= 0)) {
|
|
173
|
+
const dealer = await this.sockets.awaitClientDealerForOutbound(channelName, signal);
|
|
174
|
+
if (dealer === undefined) {
|
|
187
175
|
throw createInternalFrameworkException(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
: ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
|
|
191
|
-
this.sockets.hasKnownClientServerTargets(channelName)
|
|
192
|
-
? `Channel '${channelName}' has known ClientServer targets but no ready server.`
|
|
193
|
-
: `Channel '${channelName}' has no ready ClientServer server.`
|
|
176
|
+
ZLinkFrameworkInternalErrorKind.DeadlineExceeded,
|
|
177
|
+
`Channel '${channelName}' has no ready ClientServer server before its admission deadline.`
|
|
194
178
|
);
|
|
195
179
|
}
|
|
196
180
|
const serverRid = this.sockets.selectedClientServerRid(channelName, dealer);
|
|
@@ -201,7 +185,7 @@ export class ZLinkChannelOutboundOperations {
|
|
|
201
185
|
channelName,
|
|
202
186
|
packetName,
|
|
203
187
|
request,
|
|
204
|
-
|
|
188
|
+
timeoutMs,
|
|
205
189
|
undefined,
|
|
206
190
|
this.codecs,
|
|
207
191
|
correlationId,
|
|
@@ -221,7 +205,7 @@ export class ZLinkChannelOutboundOperations {
|
|
|
221
205
|
let replyParts: readonly Message[] = [];
|
|
222
206
|
try {
|
|
223
207
|
try {
|
|
224
|
-
replyParts = await awaitWithAbort(dealer.request(parts,
|
|
208
|
+
replyParts = await awaitWithAbort(dealer.request(parts, timeoutMs), signal);
|
|
225
209
|
} catch (error) {
|
|
226
210
|
if (signal?.aborted === true) throw error;
|
|
227
211
|
// Spec 32-framework-error-model:81-92 — classify the backend request
|
|
@@ -234,12 +218,7 @@ export class ZLinkChannelOutboundOperations {
|
|
|
234
218
|
error
|
|
235
219
|
);
|
|
236
220
|
}
|
|
237
|
-
throw
|
|
238
|
-
ZLinkFrameworkInternalErrorKind.RouteNotConnected,
|
|
239
|
-
`Channel '${channelName}' request failed before a reply was received.`,
|
|
240
|
-
true,
|
|
241
|
-
error
|
|
242
|
-
);
|
|
221
|
+
throw error;
|
|
243
222
|
}
|
|
244
223
|
return decodeChannelReply<TReply>(replyParts, this.codecs);
|
|
245
224
|
} finally {
|
|
@@ -559,7 +538,7 @@ function publishResult(status: ZLinkSubmitStatus): ZLinkSubmitResult {
|
|
|
559
538
|
return { status };
|
|
560
539
|
}
|
|
561
540
|
|
|
562
|
-
function requestTerminalResult(
|
|
541
|
+
export function requestTerminalResult(
|
|
563
542
|
error: unknown,
|
|
564
543
|
signal: AbortSignal | undefined
|
|
565
544
|
): ZLinkRuntimeMessageFlowResult {
|
|
@@ -570,7 +549,7 @@ function requestTerminalResult(
|
|
|
570
549
|
return 'failed';
|
|
571
550
|
}
|
|
572
551
|
|
|
573
|
-
function isRemoteChannelErrorReply(error: unknown): boolean {
|
|
552
|
+
export function isRemoteChannelErrorReply(error: unknown): boolean {
|
|
574
553
|
return (
|
|
575
554
|
error instanceof ZLinkFrameworkException &&
|
|
576
555
|
'origin' in error &&
|