@zlink-systems/framework 0.30.0 → 0.30.2
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/LICENSE +150 -68
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Actors/ZLinkActorClient.d.ts +2 -1
- package/dist/contracts/Channels/Calls.d.ts +2 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/ZLinkMessageMetadata.js +11 -5
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Handlers/Attributes.d.ts +5 -13
- package/dist/contracts/Handlers/Attributes.js +7 -11
- package/dist/contracts/Handlers/JsonContract.d.ts +2 -46
- package/dist/contracts/Handlers/JsonContract.js +4 -153
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +6 -1
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/nest-integration.d.ts +1 -1
- package/dist/nest-integration.js +2 -1
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +1 -2
- package/dist/runtime/actors/actor-client.js +52 -57
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +8 -4
- package/dist/runtime/actors/actor-handoff.js +219 -92
- package/dist/runtime/actors/actor-join-relocation.d.ts +3 -0
- package/dist/runtime/actors/actor-local-native-join.js +13 -12
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-remote-wire.js +15 -0
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +6 -2
- package/dist/runtime/actors/actor-routed-json-request.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +8 -3
- package/dist/runtime/actors/index.js +55 -27
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/actors/spot-actor-dispatch.js +2 -2
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +56 -23
- package/dist/runtime/application-jobs/application-ingress-record-owner.d.ts +6 -8
- package/dist/runtime/application-jobs/application-ingress-record-owner.js +39 -22
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +15 -1
- package/dist/runtime/application-jobs/application-job-queue-scope.js +61 -20
- package/dist/runtime/application-jobs/contracts.d.ts +12 -1
- package/dist/runtime/backend/contracts/index.d.ts +37 -12
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.d.ts +9 -1
- package/dist/runtime/backend/mesh-completion-table.js +154 -49
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +28 -1
- package/dist/runtime/backend/mesh-dispatch-pump.js +208 -101
- package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +2 -2
- package/dist/runtime/backend/node/node-backend-adapter-support.js +16 -9
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.d.ts +1 -1
- package/dist/runtime/backend/node/node-dealer-channel-client-transport.js +5 -2
- package/dist/runtime/backend/node/node-raw-binding-port.js +124 -72
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +46 -13
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +181 -164
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +11 -11
- package/dist/runtime/backend/raw-binding-port.d.ts +2 -2
- package/dist/runtime/backend/runtime-message.d.ts +1 -0
- package/dist/runtime/backend/runtime-message.js +5 -0
- package/dist/runtime/backend/runtime-values.d.ts +1 -0
- package/dist/runtime/backend/runtime-values.js +2 -1
- package/dist/runtime/channels/channel-clients.d.ts +2 -0
- package/dist/runtime/channels/channel-clients.js +75 -23
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +25 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.js +111 -56
- package/dist/runtime/channels/channel-dispatch-services.d.ts +1 -0
- package/dist/runtime/channels/channel-dispatch-services.js +45 -0
- package/dist/runtime/channels/channel-dispatchers.d.ts +4 -3
- package/dist/runtime/channels/channel-dispatchers.js +62 -54
- package/dist/runtime/channels/channel-envelope-inspection.d.ts +1 -2
- package/dist/runtime/channels/channel-envelope-inspection.js +1 -16
- package/dist/runtime/channels/channel-envelope.d.ts +2 -0
- package/dist/runtime/channels/channel-envelope.js +146 -28
- package/dist/runtime/channels/channel-outbound-operations.d.ts +2 -2
- package/dist/runtime/channels/channel-outbound-operations.js +8 -8
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +9 -8
- package/dist/runtime/channels/channel-runtime-manager.js +16 -16
- package/dist/runtime/channels/channel-transports.d.ts +18 -16
- package/dist/runtime/channels/channel-transports.js +77 -58
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/channels/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +2 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +2 -2
- package/dist/runtime/channels/router-socket-spot-route-transport.js +4 -4
- package/dist/runtime/channels/source-spot-router.d.ts +2 -2
- package/dist/runtime/channels/source-spot-router.js +4 -4
- package/dist/runtime/channels/spot-node-route-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-node-route-transport.js +4 -4
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +2 -2
- package/dist/runtime/channels/spot-route-bridge-transport.js +4 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +5 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +18 -18
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +5 -0
- package/dist/runtime/execution/serial-execution-queue.js +22 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/actor-join-recovery-codec.js +2 -2
- package/dist/runtime/foundation/durable-service-request.d.ts +14 -0
- package/dist/runtime/foundation/durable-service-request.js +98 -0
- package/dist/runtime/foundation/operation-identity.d.ts +1 -0
- package/dist/runtime/foundation/operation-identity.js +5 -1
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +61 -8
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +486 -266
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +3 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -34
- package/dist/runtime/foundation/service-relocation-runtime.d.ts +2 -0
- package/dist/runtime/foundation/service-relocation-runtime.js +20 -4
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +10 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +75 -9
- package/dist/runtime/foundation/service-stateful-runtime.js +486 -218
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -6
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-topology-registry.d.ts +12 -2
- package/dist/runtime/foundation/service-topology-registry.js +61 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +13 -3
- package/dist/runtime/foundation/service-wire-m6a-codec.js +189 -78
- package/dist/runtime/handlers/handler-instance-scope.d.ts +8 -0
- package/dist/runtime/handlers/handler-instance-scope.js +54 -11
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-runtime-options-factory.js +2 -2
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +40 -7
- package/dist/runtime/host/application-job-queue.js +137 -42
- package/dist/runtime/host/entry-actor-runtime.d.ts +1 -0
- package/dist/runtime/host/entry-actor-runtime.js +3 -0
- package/dist/runtime/host/index.d.ts +12 -2
- package/dist/runtime/host/index.js +300 -202
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +73 -208
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +6 -4
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-control.d.ts +1 -0
- package/dist/runtime/host/service-relocation-control.js +10 -4
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +22 -14
- package/dist/runtime/host/service-relocation-host-runtime.js +754 -599
- package/dist/runtime/host/spot-address-transport.js +3 -2
- package/dist/runtime/host/spot-runtime-options-factory.js +16 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/actor-location-claims.d.ts +2 -2
- package/dist/runtime/locations/actor-location-claims.js +34 -19
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/lifecycle.d.ts +1 -2
- package/dist/runtime/locations/lifecycle.js +2 -5
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +7 -3
- package/dist/runtime/locations/runtime.js +61 -53
- package/dist/runtime/messaging/framework-json-v1.d.ts +4 -6
- package/dist/runtime/messaging/framework-json-v1.js +38 -294
- package/dist/runtime/messaging/packet-name.d.ts +1 -1
- package/dist/runtime/messaging/packet-name.js +8 -24
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.d.ts +2 -0
- package/dist/runtime/messaging/request-result.js +57 -0
- package/dist/runtime/messaging/submission-result.d.ts +1 -0
- package/dist/runtime/messaging/submission-result.js +5 -2
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +34 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +229 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +16 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +37 -8
- package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +7 -2
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +36 -21
- package/dist/runtime/spots/index.d.ts +21 -11
- package/dist/runtime/spots/index.js +243 -178
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +7 -3
- package/dist/runtime/spots/spot-activation.js +140 -52
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +20 -11
- package/dist/runtime/spots/spot-handler-registry.d.ts +7 -4
- package/dist/runtime/spots/spot-handler-registry.js +24 -10
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +22 -42
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.d.ts +3 -0
- package/dist/runtime/spots/spot-outbound.js +27 -18
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +1 -0
- package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +1 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +1 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -4
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +288 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.d.ts +1 -1
- package/dist/runtime/streams/stream-session-runtime.js +14 -31
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Actors/ZLinkActorClient.ts +2 -1
- package/src/contracts/Channels/Calls.ts +2 -1
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/ZLinkMessageMetadata.ts +13 -8
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Handlers/Attributes.ts +14 -21
- package/src/contracts/Handlers/JsonContract.ts +8 -216
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +10 -1
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/nest-integration.ts +1 -0
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +100 -85
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +291 -110
- package/src/runtime/actors/actor-join-relocation.ts +3 -0
- package/src/runtime/actors/actor-local-native-join.ts +21 -26
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-remote-wire.ts +17 -0
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-routed-join-transport.ts +14 -4
- package/src/runtime/actors/actor-routed-json-request.ts +10 -2
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +60 -32
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/actors/spot-actor-dispatch.ts +4 -2
- package/src/runtime/admission.ts +69 -21
- package/src/runtime/application-jobs/application-ingress-record-owner.ts +41 -25
- package/src/runtime/application-jobs/application-job-queue-scope.ts +83 -22
- package/src/runtime/application-jobs/contracts.ts +16 -1
- package/src/runtime/backend/contracts/index.ts +92 -18
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +160 -57
- package/src/runtime/backend/mesh-dispatch-pump.ts +237 -108
- package/src/runtime/backend/node/node-backend-adapter-support.ts +17 -8
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +12 -2
- package/src/runtime/backend/node/node-raw-binding-port.ts +148 -85
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +315 -201
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +26 -11
- package/src/runtime/backend/raw-binding-port.ts +7 -2
- package/src/runtime/backend/runtime-message.ts +6 -0
- package/src/runtime/backend/runtime-values.ts +1 -0
- package/src/runtime/channels/channel-clients.ts +132 -58
- package/src/runtime/channels/channel-dispatch-pipeline.ts +198 -114
- package/src/runtime/channels/channel-dispatch-services.ts +69 -1
- package/src/runtime/channels/channel-dispatchers.ts +136 -90
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -16
- package/src/runtime/channels/channel-envelope.ts +225 -31
- package/src/runtime/channels/channel-outbound-operations.ts +22 -8
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +41 -17
- package/src/runtime/channels/channel-transports.ts +171 -112
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/channels/local-spot-route-transport.ts +3 -1
- package/src/runtime/channels/router-socket-spot-route-transport.ts +13 -4
- package/src/runtime/channels/source-spot-router.ts +8 -4
- package/src/runtime/channels/spot-node-route-transport.ts +8 -4
- package/src/runtime/channels/spot-route-bridge-transport.ts +6 -4
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +47 -18
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +33 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/actor-join-recovery-codec.ts +2 -2
- package/src/runtime/foundation/durable-service-request.ts +137 -0
- package/src/runtime/foundation/operation-identity.ts +5 -1
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +704 -336
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +55 -36
- package/src/runtime/foundation/service-relocation-runtime.ts +25 -4
- package/src/runtime/foundation/service-runtime-contracts.ts +19 -2
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +732 -275
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -16
- package/src/runtime/foundation/service-topology-registry.ts +91 -36
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +231 -76
- package/src/runtime/handlers/handler-instance-scope.ts +67 -16
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-runtime-options-factory.ts +13 -2
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +160 -41
- package/src/runtime/host/entry-actor-runtime.ts +4 -0
- package/src/runtime/host/index.ts +473 -271
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +88 -271
- package/src/runtime/host/route-mesh-runtime.ts +12 -6
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-control.ts +11 -5
- package/src/runtime/host/service-relocation-host-runtime.ts +1092 -759
- package/src/runtime/host/spot-address-transport.ts +4 -2
- package/src/runtime/host/spot-runtime-options-factory.ts +20 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/actor-location-claims.ts +52 -30
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/lifecycle.ts +8 -26
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +98 -64
- package/src/runtime/messaging/framework-json-v1.ts +5 -325
- package/src/runtime/messaging/packet-name.ts +5 -25
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +62 -0
- package/src/runtime/messaging/submission-result.ts +5 -1
- package/src/runtime/protocol/service_wire_codec.generated.ts +218 -5
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +16 -13
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +46 -25
- package/src/runtime/spots/index.ts +389 -283
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +198 -96
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +33 -21
- package/src/runtime/spots/spot-handler-registry.ts +56 -12
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +28 -47
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +39 -19
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +2 -1
- package/src/runtime/spots/spot-runtime-ports.ts +1 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -4
- package/src/runtime/spots/spot-timer.ts +418 -158
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +13 -34
- package/src/runtime/workers/index.ts +1 -1
|
@@ -4,7 +4,7 @@ export declare function wrapSocket<T extends {
|
|
|
4
4
|
close(): void;
|
|
5
5
|
}>(nativeInstance: T, pollCompletion?: boolean): T & ZLinkBackendObject;
|
|
6
6
|
export declare function nodeEventLoopPollerOf(socket: object): ZLinkNodeEventLoopPoller;
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function disconnectSocketPeer(socket: {
|
|
8
8
|
disconnectRid(routingId: unknown): void;
|
|
9
9
|
}, routingId: unknown): void;
|
|
10
10
|
export declare function isEndpointCloseIgnorableError(error: unknown): boolean;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.wrapSocket = wrapSocket;
|
|
4
4
|
exports.nodeEventLoopPollerOf = nodeEventLoopPollerOf;
|
|
5
|
-
exports.
|
|
5
|
+
exports.disconnectSocketPeer = disconnectSocketPeer;
|
|
6
6
|
exports.isEndpointCloseIgnorableError = isEndpointCloseIgnorableError;
|
|
7
7
|
const RegistrationBuilderPolicy_1 = require("../../../contracts/Configuration/RegistrationBuilderPolicy");
|
|
8
8
|
const node_backend_adapter_support_1 = require("./node-backend-adapter-support");
|
|
@@ -144,12 +144,12 @@ function wrapSocket(nativeInstance, pollCompletion) {
|
|
|
144
144
|
},
|
|
145
145
|
request(...args) {
|
|
146
146
|
if (hasRoutedPeer) {
|
|
147
|
-
const [routingId, payload, timeoutMs] = args;
|
|
148
|
-
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs);
|
|
147
|
+
const [routingId, payload, timeoutMs, onAdmitted] = args;
|
|
148
|
+
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request((0, node_backend_adapter_support_1.toNativeRoutingId)(routingId)), payload, timeoutMs, undefined, onAdmitted);
|
|
149
149
|
}
|
|
150
150
|
if (hasRequest) {
|
|
151
|
-
const [payload, timeoutMs] = args;
|
|
152
|
-
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived);
|
|
151
|
+
const [payload, timeoutMs, onAdmitted] = args;
|
|
152
|
+
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.request(), payload, timeoutMs, adapter.receiveAdmission?.recordReceived, onAdmitted);
|
|
153
153
|
}
|
|
154
154
|
throw new TypeError('Backend request requires a DEALER or ROUTER socket.');
|
|
155
155
|
},
|
|
@@ -201,11 +201,11 @@ function wrapSocket(nativeInstance, pollCompletion) {
|
|
|
201
201
|
const operation = nativeInstance.sendToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot));
|
|
202
202
|
await (0, node_backend_adapter_support_1.submitBindingAsyncSend)(operation, payload);
|
|
203
203
|
},
|
|
204
|
-
requestToSpot(targetRid, targetSpot, payload, timeoutMs) {
|
|
205
|
-
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs);
|
|
204
|
+
requestToSpot(targetRid, targetSpot, payload, timeoutMs, onAdmitted) {
|
|
205
|
+
return (0, node_backend_adapter_support_1.submitBindingRequest)(nativeInstance.requestToSpot((0, node_backend_adapter_support_1.toNativeRoutingId)(targetRid), (0, node_backend_adapter_support_1.toNativeRoutingId)(targetSpot)), payload, timeoutMs, undefined, onAdmitted);
|
|
206
206
|
},
|
|
207
207
|
disconnectPeer(routingId) {
|
|
208
|
-
|
|
208
|
+
disconnectSocketPeer(nativeInstance, (0, node_backend_adapter_support_1.toNativeRoutingId)(routingId));
|
|
209
209
|
},
|
|
210
210
|
async bindActor(_sessionRid, _actor, _timeoutMs, _signal) {
|
|
211
211
|
throw new Error('Session Actor dispatch requires enableActorDispatch() and a Framework MeshNode service route.');
|
|
@@ -228,13 +228,13 @@ function nodeEventLoopPollerOf(socket) {
|
|
|
228
228
|
}
|
|
229
229
|
return poller;
|
|
230
230
|
}
|
|
231
|
-
function
|
|
231
|
+
function disconnectSocketPeer(socket, routingId) {
|
|
232
232
|
try {
|
|
233
|
-
socket.disconnectRid(
|
|
233
|
+
socket.disconnectRid(routingId);
|
|
234
234
|
}
|
|
235
235
|
catch (error) {
|
|
236
236
|
// An absent RID has already completed the physical close. The existing
|
|
237
|
-
//
|
|
237
|
+
// logical lifecycle still owns local cleanup and unbind.
|
|
238
238
|
if (!(0, node_backend_adapter_support_1.isBindingNotFound)(error))
|
|
239
239
|
throw error;
|
|
240
240
|
}
|
|
@@ -56,7 +56,7 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
|
|
|
56
56
|
setRoutingId(routingId: string): void;
|
|
57
57
|
connectToRoutingId(routingId: string, endpoint: string): void;
|
|
58
58
|
send(targetRid: string, parts: readonly Uint8Array[]): Promise<void>;
|
|
59
|
-
request(targetRid: string, parts: readonly Uint8Array[], timeoutMs: number, recordReceived?: () => void): Promise<readonly Buffer[]>;
|
|
59
|
+
request(targetRid: string, parts: readonly Uint8Array[], timeoutMs: number, recordReceived?: () => void, onAdmitted?: () => void): Promise<readonly Buffer[]>;
|
|
60
60
|
receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
|
|
61
61
|
/** The selected route of every RID. The socket's one route observer calls it. */
|
|
62
62
|
routesSnapshot(): readonly ZLinkRawRouterRoute[];
|
|
@@ -64,7 +64,7 @@ export interface ZLinkRawRouterPort extends ZLinkRawSocketPort {
|
|
|
64
64
|
export interface ZLinkRawDealerPort extends ZLinkRawSocketPort {
|
|
65
65
|
setRoutingId(routingId: string): void;
|
|
66
66
|
send(parts: readonly Uint8Array[]): Promise<void>;
|
|
67
|
-
request(parts: readonly Uint8Array[], timeoutMs: number): Promise<readonly Buffer[]>;
|
|
67
|
+
request(parts: readonly Uint8Array[], timeoutMs: number, onAdmitted?: () => void): Promise<readonly Buffer[]>;
|
|
68
68
|
receive(dontWait?: boolean): ZLinkRawReceivedRecord | undefined;
|
|
69
69
|
}
|
|
70
70
|
export interface ZLinkRawHostPort {
|
|
@@ -4,6 +4,7 @@ export declare class ZLinkBufferMessage implements Message {
|
|
|
4
4
|
private constructor();
|
|
5
5
|
static from(value: Message | Buffer | Uint8Array | string): ZLinkBufferMessage;
|
|
6
6
|
static fromOwned(bytes: Buffer): ZLinkBufferMessage;
|
|
7
|
+
static retainPayload(message: Message): Buffer;
|
|
7
8
|
data(): Buffer;
|
|
8
9
|
toBytes(): Uint8Array;
|
|
9
10
|
copy(): Message;
|
|
@@ -16,6 +16,11 @@ class ZLinkBufferMessage {
|
|
|
16
16
|
static fromOwned(bytes) {
|
|
17
17
|
return new ZLinkBufferMessage(bytes);
|
|
18
18
|
}
|
|
19
|
+
static retainPayload(message) {
|
|
20
|
+
// Binding data() Buffers retain their storage after the message handle closes.
|
|
21
|
+
// Preserve that ownership at runtime boundaries without copying the payload.
|
|
22
|
+
return message.data();
|
|
23
|
+
}
|
|
19
24
|
data() {
|
|
20
25
|
return this.bytes;
|
|
21
26
|
}
|
|
@@ -36,6 +36,7 @@ export type SubmitResult = (typeof SubmitResult)[keyof typeof SubmitResult];
|
|
|
36
36
|
export type ZLinkBackendSendFlags = number;
|
|
37
37
|
export type ZLinkBackendRecvFlags = number;
|
|
38
38
|
export declare const ZLINK_BACKEND_SEND_NONE: ZLinkBackendSendFlags;
|
|
39
|
+
export declare const ZLINK_BACKEND_SEND_DONT_WAIT: ZLinkBackendSendFlags;
|
|
39
40
|
export declare const ZLINK_BACKEND_RECV_DONT_WAIT: ZLinkBackendRecvFlags;
|
|
40
41
|
export declare class ZLinkBackendResultError extends Error {
|
|
41
42
|
readonly operation: 'request' | 'submit';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ZLinkBackendResultError = exports.ZLINK_BACKEND_RECV_DONT_WAIT = exports.ZLINK_BACKEND_SEND_NONE = exports.SubmitResult = exports.RequestResult = void 0;
|
|
3
|
+
exports.ZLinkBackendResultError = exports.ZLINK_BACKEND_RECV_DONT_WAIT = exports.ZLINK_BACKEND_SEND_DONT_WAIT = exports.ZLINK_BACKEND_SEND_NONE = exports.SubmitResult = exports.RequestResult = void 0;
|
|
4
4
|
exports.isZLinkBackendResultError = isZLinkBackendResultError;
|
|
5
5
|
exports.isBackendNotConnectedError = isBackendNotConnectedError;
|
|
6
6
|
exports.isBackendRequestTimeoutError = isBackendRequestTimeoutError;
|
|
@@ -37,6 +37,7 @@ exports.SubmitResult = Object.freeze({
|
|
|
37
37
|
NotAdmitted: 13
|
|
38
38
|
});
|
|
39
39
|
exports.ZLINK_BACKEND_SEND_NONE = 0;
|
|
40
|
+
exports.ZLINK_BACKEND_SEND_DONT_WAIT = 1;
|
|
40
41
|
exports.ZLINK_BACKEND_RECV_DONT_WAIT = 1;
|
|
41
42
|
class ZLinkBackendResultError extends Error {
|
|
42
43
|
operation;
|
|
@@ -35,6 +35,8 @@ export declare class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
35
35
|
private readonly transport?;
|
|
36
36
|
private readonly spotRouterChannelIdForMesh;
|
|
37
37
|
private readonly channelTransport?;
|
|
38
|
+
private readonly nodeSends;
|
|
39
|
+
private readonly nodeRequests;
|
|
38
40
|
constructor(registration: ZLinkFrameworkRegistration, transport?: ZLinkRouteClientTransport | undefined, spotRouterChannelIdForMesh?: (meshName: string) => string, channelTransport?: ZLinkChannelClientTransportSource | undefined);
|
|
39
41
|
sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall;
|
|
40
42
|
requestToNode(meshName: string, targetNodeRid: string, request: unknown): ZLinkRequestCall;
|
|
@@ -4,6 +4,7 @@ exports.DefaultZLinkSpotPublisherClient = exports.DefaultZLinkRouteClient = expo
|
|
|
4
4
|
exports.resolveChannelRoute = resolveChannelRoute;
|
|
5
5
|
exports.requireUniqueRouteMeshChannel = requireUniqueRouteMeshChannel;
|
|
6
6
|
const Registration_1 = require("../../contracts/Configuration/Registration");
|
|
7
|
+
const request_result_1 = require("../messaging/request-result");
|
|
7
8
|
const configuration_1 = require("../configuration");
|
|
8
9
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
9
10
|
const submission_result_1 = require("../messaging/submission-result");
|
|
@@ -79,6 +80,8 @@ class DefaultZLinkRouteClient {
|
|
|
79
80
|
transport;
|
|
80
81
|
spotRouterChannelIdForMesh;
|
|
81
82
|
channelTransport;
|
|
83
|
+
nodeSends = new Map();
|
|
84
|
+
nodeRequests = new Map();
|
|
82
85
|
constructor(registration, transport, spotRouterChannelIdForMesh = (meshName) => meshName, channelTransport) {
|
|
83
86
|
this.registration = registration;
|
|
84
87
|
this.transport = transport;
|
|
@@ -86,10 +89,34 @@ class DefaultZLinkRouteClient {
|
|
|
86
89
|
this.channelTransport = channelTransport;
|
|
87
90
|
}
|
|
88
91
|
sendToNode(meshName, targetNodeRid, message) {
|
|
89
|
-
|
|
92
|
+
let targets = this.nodeSends.get(meshName);
|
|
93
|
+
if (targets === undefined)
|
|
94
|
+
this.nodeSends.set(meshName, (targets = new Map()));
|
|
95
|
+
let prepared = targets.get(targetNodeRid);
|
|
96
|
+
if (prepared === undefined) {
|
|
97
|
+
prepared = {
|
|
98
|
+
validate: () => {
|
|
99
|
+
this.requireMesh(meshName);
|
|
100
|
+
},
|
|
101
|
+
submit: (packetName, metadata, payload) => normalizeSubmitResult(this.requireTransport().submit(meshName, targetNodeRid, packetName, payload, metadata))
|
|
102
|
+
};
|
|
103
|
+
targets.set(targetNodeRid, prepared);
|
|
104
|
+
}
|
|
105
|
+
return new DefaultZLinkSendCall(prepared.validate, prepared.submit, message);
|
|
90
106
|
}
|
|
91
107
|
requestToNode(meshName, targetNodeRid, request) {
|
|
92
|
-
|
|
108
|
+
let targets = this.nodeRequests.get(meshName);
|
|
109
|
+
if (targets === undefined)
|
|
110
|
+
this.nodeRequests.set(meshName, (targets = new Map()));
|
|
111
|
+
let prepared = targets.get(targetNodeRid);
|
|
112
|
+
if (prepared === undefined) {
|
|
113
|
+
prepared = {
|
|
114
|
+
validate: () => this.requireMesh(meshName),
|
|
115
|
+
submit: (packetName, timeoutMs, metadata, signal, onAdmitted, message) => this.requireTransport().request(meshName, targetNodeRid, packetName, message, timeoutMs, signal, metadata, onAdmitted)
|
|
116
|
+
};
|
|
117
|
+
targets.set(targetNodeRid, prepared);
|
|
118
|
+
}
|
|
119
|
+
return new DefaultZLinkRequestCall(prepared.validate, prepared.submit, this.defaultRequestTimeout(meshName), request);
|
|
93
120
|
}
|
|
94
121
|
sendToChannel(channelName, message) {
|
|
95
122
|
return new DefaultZLinkSendCall(() => this.requireChannelRoute(channelName), async (packetName, metadata) => {
|
|
@@ -101,12 +128,12 @@ class DefaultZLinkRouteClient {
|
|
|
101
128
|
});
|
|
102
129
|
}
|
|
103
130
|
requestToChannel(channelName, request) {
|
|
104
|
-
return new DefaultZLinkRequestCall(() => this.requireChannelRoute(channelName), (packetName, timeoutMs, metadata, signal) => {
|
|
131
|
+
return new DefaultZLinkRequestCall(() => this.requireChannelRoute(channelName), (packetName, timeoutMs, metadata, signal, onAdmitted) => {
|
|
105
132
|
const route = this.requireChannelRoute(channelName);
|
|
106
133
|
if (route.kind === 'route-mesh') {
|
|
107
|
-
return this.requireTransport().requestToChannel(route.meshName, channelName, packetName, request, timeoutMs, signal, metadata);
|
|
134
|
+
return this.requireTransport().requestToChannel(route.meshName, channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted);
|
|
108
135
|
}
|
|
109
|
-
return this.requireChannelTransport().request(channelName, packetName, request, timeoutMs, signal, metadata);
|
|
136
|
+
return this.requireChannelTransport().request(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted);
|
|
110
137
|
}, this.defaultRequestTimeoutForChannel(channelName));
|
|
111
138
|
}
|
|
112
139
|
sendToSpot(spot, message) {
|
|
@@ -123,10 +150,11 @@ class DefaultZLinkRouteClient {
|
|
|
123
150
|
requestToSpot(spot, request) {
|
|
124
151
|
return new DefaultZLinkRequestCall(() => {
|
|
125
152
|
this.requireSpotTransport();
|
|
126
|
-
}, (_packetName, timeoutMs, metadata, signal) => (0, spot_outbound_1.requestToSpotHandle)(this.requireSpotTransport(), spot, request, {
|
|
153
|
+
}, (_packetName, timeoutMs, metadata, signal, onAdmitted) => (0, spot_outbound_1.requestToSpotHandle)(this.requireSpotTransport(), spot, request, {
|
|
127
154
|
timeoutMs,
|
|
128
155
|
signal,
|
|
129
156
|
metadata,
|
|
157
|
+
onAdmitted,
|
|
130
158
|
spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
|
|
131
159
|
}), this.registration.requestTimeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS);
|
|
132
160
|
}
|
|
@@ -217,14 +245,17 @@ exports.DefaultZLinkSpotPublisherClient = DefaultZLinkSpotPublisherClient;
|
|
|
217
245
|
class DefaultZLinkSendCall {
|
|
218
246
|
validate;
|
|
219
247
|
submitter;
|
|
220
|
-
|
|
248
|
+
message;
|
|
249
|
+
selectedMetadata;
|
|
221
250
|
executed = false;
|
|
222
|
-
constructor(validate, submitter) {
|
|
251
|
+
constructor(validate, submitter, message) {
|
|
223
252
|
this.validate = validate;
|
|
224
253
|
this.submitter = submitter;
|
|
254
|
+
this.message = message;
|
|
225
255
|
}
|
|
226
256
|
metadata(keyOrMetadata, value) {
|
|
227
257
|
ensureNotExecuted(this.executed);
|
|
258
|
+
this.selectedMetadata ??= new Map();
|
|
228
259
|
if (typeof keyOrMetadata === 'string') {
|
|
229
260
|
this.selectedMetadata.set(keyOrMetadata, value);
|
|
230
261
|
}
|
|
@@ -235,12 +266,20 @@ class DefaultZLinkSendCall {
|
|
|
235
266
|
}
|
|
236
267
|
return this;
|
|
237
268
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
269
|
+
submit() {
|
|
270
|
+
try {
|
|
271
|
+
ensureNotExecuted(this.executed);
|
|
272
|
+
this.validate();
|
|
273
|
+
this.executed = true;
|
|
274
|
+
const result = this.submitter(undefined, this.selectedMetadata ?? EMPTY_CALL_METADATA, this.message);
|
|
275
|
+
if (result instanceof Promise)
|
|
276
|
+
return result.then(completeOneWaySend);
|
|
277
|
+
completeOneWaySend(result);
|
|
278
|
+
return completedOneWaySend;
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
return Promise.reject(error);
|
|
282
|
+
}
|
|
244
283
|
}
|
|
245
284
|
}
|
|
246
285
|
function ensureNotExecuted(executed) {
|
|
@@ -248,22 +287,33 @@ function ensureNotExecuted(executed) {
|
|
|
248
287
|
(0, submission_result_1.throwAlreadySubmitted)('ZLink call');
|
|
249
288
|
}
|
|
250
289
|
}
|
|
290
|
+
const EMPTY_CALL_METADATA = new Map();
|
|
291
|
+
const completedOneWaySend = Promise.resolve();
|
|
292
|
+
function completeOneWaySend(result) {
|
|
293
|
+
(0, submission_result_1.requireOneWayCompletion)(result, 'One-way send');
|
|
294
|
+
}
|
|
251
295
|
function normalizeSubmitResult(result) {
|
|
252
|
-
return result
|
|
296
|
+
return result instanceof Promise
|
|
297
|
+
? result.then((value) => value ?? submission_result_1.submittedResult)
|
|
298
|
+
: (result ?? submission_result_1.submittedResult);
|
|
253
299
|
}
|
|
254
300
|
class DefaultZLinkRequestCall {
|
|
255
301
|
validate;
|
|
256
302
|
submitter;
|
|
257
303
|
defaultRequestTimeoutMs;
|
|
304
|
+
message;
|
|
258
305
|
timeoutMs;
|
|
259
|
-
selectedMetadata
|
|
306
|
+
selectedMetadata;
|
|
260
307
|
turn = (0, execution_1.captureZLinkSpotSerialTurn)();
|
|
261
|
-
|
|
308
|
+
/** `message` is the request payload a prepared submitter receives per call. */
|
|
309
|
+
constructor(validate, submitter, defaultRequestTimeoutMs, message) {
|
|
262
310
|
this.validate = validate;
|
|
263
311
|
this.submitter = submitter;
|
|
264
312
|
this.defaultRequestTimeoutMs = defaultRequestTimeoutMs;
|
|
313
|
+
this.message = message;
|
|
265
314
|
}
|
|
266
315
|
metadata(keyOrMetadata, value) {
|
|
316
|
+
this.selectedMetadata ??= new Map();
|
|
267
317
|
if (typeof keyOrMetadata === 'string') {
|
|
268
318
|
this.selectedMetadata.set(keyOrMetadata, value);
|
|
269
319
|
}
|
|
@@ -278,17 +328,19 @@ class DefaultZLinkRequestCall {
|
|
|
278
328
|
this.timeoutMs = timeoutMs;
|
|
279
329
|
return this;
|
|
280
330
|
}
|
|
281
|
-
|
|
282
|
-
(0,
|
|
283
|
-
|
|
284
|
-
|
|
331
|
+
submit(signal) {
|
|
332
|
+
return (0, request_result_1.createZLinkRequest)((onAdmitted) => {
|
|
333
|
+
(0, abort_1.throwIfAborted)(signal);
|
|
334
|
+
this.validate();
|
|
335
|
+
return this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata), signal, onAdmitted, this.message);
|
|
336
|
+
});
|
|
285
337
|
}
|
|
286
338
|
async yield(signal) {
|
|
287
339
|
const turn = (0, execution_1.requireZLinkYieldTurn)(this.turn);
|
|
288
340
|
(0, abort_1.throwIfAborted)(signal);
|
|
289
341
|
this.validate();
|
|
290
|
-
const pending = this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, new Map(this.selectedMetadata), signal);
|
|
291
|
-
return turn.
|
|
342
|
+
const pending = this.submitter(undefined, this.timeoutMs ?? this.defaultRequestTimeoutMs, this.selectedMetadata === undefined ? EMPTY_CALL_METADATA : new Map(this.selectedMetadata), signal, undefined, this.message);
|
|
343
|
+
return turn.yieldFrameworkPromise(pending);
|
|
292
344
|
}
|
|
293
345
|
}
|
|
294
346
|
class DefaultZLinkPublishCall {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import type { ZLinkMessageContext, ZLinkHandlerFilter, ZLinkUnhandledDispatchOptions, ZLinkFlowOrigin } from '../../contracts';
|
|
2
3
|
import { ZLinkFrameworkException } from '../../contracts';
|
|
3
4
|
import { ZLinkDispatchMessageKind, ZLinkDispatchErrorSurface } from '../../contracts/Dispatch/ZLinkDispatchOptions';
|
|
@@ -31,7 +32,7 @@ interface ZLinkOneWayDispatch<TContext extends ZLinkMessageContext> {
|
|
|
31
32
|
readonly context: TContext;
|
|
32
33
|
readonly signal?: AbortSignal;
|
|
33
34
|
}
|
|
34
|
-
interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
|
|
35
|
+
export interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
|
|
35
36
|
readonly fields: ZLinkChannelDispatchFields;
|
|
36
37
|
readonly envelope: ZLinkChannelEnvelope;
|
|
37
38
|
readonly codecs?: ZLinkChannelEnvelopeCodecRegistry;
|
|
@@ -39,16 +40,34 @@ interface ZLinkRequestDispatch<TContext extends ZLinkMessageContext> {
|
|
|
39
40
|
readonly context: TContext;
|
|
40
41
|
readonly signal?: AbortSignal;
|
|
41
42
|
readonly missingHandlerMessage: string;
|
|
42
|
-
readonly writeReply: (reply: unknown) => Promise<void>;
|
|
43
|
-
readonly writeError: (error: unknown) => Promise<void>;
|
|
43
|
+
readonly writeReply: (reply: unknown) => void | Promise<void>;
|
|
44
|
+
readonly writeError: (error: unknown) => void | Promise<void>;
|
|
44
45
|
}
|
|
45
46
|
export declare class ZLinkChannelDispatchPipeline {
|
|
46
47
|
private readonly options;
|
|
47
48
|
private readonly filters;
|
|
48
49
|
private readonly unhandled;
|
|
49
50
|
constructor(options: ZLinkChannelDispatchPipelineOptions);
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
/**
|
|
52
|
+
* Runs the handler in the caller's execution turn. A synchronous handler
|
|
53
|
+
* completes here; an asynchronous handler adds exactly one continuation
|
|
54
|
+
* for its terminal trace or error record.
|
|
55
|
+
*/
|
|
56
|
+
dispatchOneWay<TContext extends ZLinkMessageContext>(dispatch: ZLinkOneWayDispatch<TContext>, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
57
|
+
private dispatchMissingOneWay;
|
|
58
|
+
private completeOneWay;
|
|
59
|
+
private failOneWay;
|
|
60
|
+
/**
|
|
61
|
+
* Runs the handler in the caller's execution turn and writes its reply in
|
|
62
|
+
* the same turn when the handler completes synchronously. An asynchronous
|
|
63
|
+
* handler adds exactly one continuation that writes the reply.
|
|
64
|
+
*/
|
|
65
|
+
dispatchRequest<TContext extends ZLinkMessageContext>(dispatch: ZLinkRequestDispatch<TContext>, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
66
|
+
private dispatchMissingRequest;
|
|
67
|
+
private invokeInFlow;
|
|
68
|
+
private completeRequest;
|
|
69
|
+
private replyPathMissing;
|
|
70
|
+
private failRequest;
|
|
52
71
|
dropMissingReplyPath(fields: ZLinkChannelDispatchFields): void;
|
|
53
72
|
/**
|
|
54
73
|
* Terminal handling for an envelope that failed structural decoding.
|
|
@@ -66,6 +85,7 @@ export declare class ZLinkChannelDispatchPipeline {
|
|
|
66
85
|
readonly writeProtocolError?: (error: ZLinkFrameworkException) => Promise<void>;
|
|
67
86
|
}): Promise<void>;
|
|
68
87
|
private invoke;
|
|
88
|
+
private invokeFiltered;
|
|
69
89
|
private createFilterContext;
|
|
70
90
|
private dispatchKind;
|
|
71
91
|
private report;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkChannelDispatchPipeline = void 0;
|
|
4
4
|
const framework_errors_internal_1 = require("../framework-errors-internal");
|
|
5
|
+
const abort_1 = require("../abort");
|
|
5
6
|
const contracts_1 = require("../../contracts");
|
|
6
7
|
const ZLinkDispatchOptions_1 = require("../../contracts/Dispatch/ZLinkDispatchOptions");
|
|
7
8
|
const handlers_1 = require("../handlers");
|
|
@@ -17,75 +18,126 @@ class ZLinkChannelDispatchPipeline {
|
|
|
17
18
|
this.filters = options.filters ?? [];
|
|
18
19
|
this.unhandled = options.unhandled ?? DEFAULT_UNHANDLED_DISPATCH;
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Runs the handler in the caller's execution turn. A synchronous handler
|
|
23
|
+
* completes here; an asynchronous handler adds exactly one continuation
|
|
24
|
+
* for its terminal trace or error record.
|
|
25
|
+
*/
|
|
26
|
+
dispatchOneWay(dispatch, admit) {
|
|
27
|
+
if (admit !== undefined) {
|
|
28
|
+
const pipeline = this;
|
|
29
|
+
const record = dispatch;
|
|
30
|
+
return admit(() => pipeline.dispatchOneWay(record), (error) => pipeline.failOneWay(record.fields, error));
|
|
31
|
+
}
|
|
21
32
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, dispatch.fields);
|
|
22
33
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, dispatch.fields);
|
|
23
|
-
if (dispatch.handler === undefined)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
: this.unhandled.send;
|
|
27
|
-
this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
|
|
28
|
-
this.applyOneWayUnhandled(action, dispatch.fields);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
34
|
+
if (dispatch.handler === undefined)
|
|
35
|
+
return this.dispatchMissingOneWay(dispatch.fields);
|
|
36
|
+
let invocation;
|
|
31
37
|
try {
|
|
32
|
-
|
|
33
|
-
const invocation = await (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, dispatch.handler, dispatch.context, dispatch.fields, dispatch.signal));
|
|
34
|
-
if (invocation.handlerInvoked) {
|
|
35
|
-
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, dispatch.fields);
|
|
36
|
-
}
|
|
38
|
+
invocation = this.invokeInFlow(dispatch, dispatch.handler);
|
|
37
39
|
}
|
|
38
40
|
catch (error) {
|
|
39
|
-
this.
|
|
41
|
+
this.failOneWay(dispatch.fields, error);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!(0, abort_1.isPromiseLike)(invocation)) {
|
|
45
|
+
this.completeOneWay(dispatch.fields, invocation);
|
|
46
|
+
return;
|
|
40
47
|
}
|
|
48
|
+
return Promise.resolve(invocation).then((value) => this.completeOneWay(dispatch.fields, value), (error) => this.failOneWay(dispatch.fields, error));
|
|
41
49
|
}
|
|
42
|
-
async
|
|
50
|
+
async dispatchMissingOneWay(fields) {
|
|
51
|
+
const action = fields.messageKind === ZLinkDispatchOptions_1.ZLinkDispatchMessageKind.Publish
|
|
52
|
+
? this.unhandled.publish
|
|
53
|
+
: this.unhandled.send;
|
|
54
|
+
this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
|
|
55
|
+
this.applyOneWayUnhandled(action, fields);
|
|
56
|
+
}
|
|
57
|
+
completeOneWay(fields, invocation) {
|
|
58
|
+
if (invocation !== HANDLER_FILTER_REJECTED) {
|
|
59
|
+
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Completed, fields);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
failOneWay(fields, error) {
|
|
63
|
+
this.report(fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Runs the handler in the caller's execution turn and writes its reply in
|
|
67
|
+
* the same turn when the handler completes synchronously. An asynchronous
|
|
68
|
+
* handler adds exactly one continuation that writes the reply.
|
|
69
|
+
*/
|
|
70
|
+
dispatchRequest(dispatch, admit) {
|
|
71
|
+
if (admit !== undefined) {
|
|
72
|
+
const pipeline = this;
|
|
73
|
+
const record = dispatch;
|
|
74
|
+
return admit(() => pipeline.dispatchRequest(record), (error) => pipeline.failRequest(record, error));
|
|
75
|
+
}
|
|
43
76
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Received, dispatch.fields);
|
|
44
77
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Admitted, dispatch.fields);
|
|
45
|
-
if (dispatch.handler === undefined)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError
|
|
51
|
-
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError
|
|
52
|
-
: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
|
|
53
|
-
if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.Throw) {
|
|
54
|
-
throw missing;
|
|
55
|
-
}
|
|
56
|
-
return;
|
|
78
|
+
if (dispatch.handler === undefined)
|
|
79
|
+
return this.dispatchMissingRequest(dispatch);
|
|
80
|
+
let invocation;
|
|
81
|
+
try {
|
|
82
|
+
invocation = this.invokeInFlow(dispatch, dispatch.handler);
|
|
57
83
|
}
|
|
58
|
-
|
|
84
|
+
catch (error) {
|
|
85
|
+
return this.failRequest(dispatch, error);
|
|
86
|
+
}
|
|
87
|
+
if (!(0, abort_1.isPromiseLike)(invocation))
|
|
88
|
+
return this.completeRequest(dispatch, invocation);
|
|
89
|
+
return Promise.resolve(invocation).then((value) => this.completeRequest(dispatch, value), (error) => this.failRequest(dispatch, error));
|
|
90
|
+
}
|
|
91
|
+
async dispatchMissingRequest(dispatch) {
|
|
92
|
+
const missing = (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.HandlerNotFound, dispatch.missingHandlerMessage);
|
|
93
|
+
if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError) {
|
|
94
|
+
await dispatch.writeError(missing);
|
|
95
|
+
}
|
|
96
|
+
this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.HandlerMissing, this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.ReplyError
|
|
97
|
+
? ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError
|
|
98
|
+
: ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
|
|
99
|
+
if (this.unhandled.request === contracts_1.ZLinkUnhandledDispatchAction.Throw) {
|
|
100
|
+
throw missing;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
invokeInFlow(dispatch, handler) {
|
|
104
|
+
const flow = (0, flow_context_1.createInboundFlow)(dispatch.fields.flowId, dispatch.fields.flowOrigin, this.options.dispatchErrors.flow.flowCreationEnabled(), undefined);
|
|
105
|
+
return flow === undefined
|
|
106
|
+
? this.invoke(dispatch.envelope, dispatch.codecs, handler, dispatch.context, dispatch.fields, dispatch.signal)
|
|
107
|
+
: (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, handler, dispatch.context, dispatch.fields, dispatch.signal));
|
|
108
|
+
}
|
|
109
|
+
completeRequest(dispatch, invocation) {
|
|
110
|
+
if (invocation === HANDLER_FILTER_REJECTED) {
|
|
111
|
+
return this.failRequest(dispatch, (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestRejected, `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`));
|
|
112
|
+
}
|
|
113
|
+
let written;
|
|
59
114
|
try {
|
|
60
|
-
|
|
61
|
-
const invocation = await (0, flow_context_1.runWithFlow)(flow, () => this.invoke(dispatch.envelope, dispatch.codecs, dispatch.handler, dispatch.context, dispatch.fields, dispatch.signal));
|
|
62
|
-
if (!invocation.handlerInvoked) {
|
|
63
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestRejected, `A handler filter rejected '${this.options.channelName}:${dispatch.fields.packetName}'.`);
|
|
64
|
-
}
|
|
65
|
-
reply = invocation.value;
|
|
115
|
+
written = dispatch.writeReply(invocation);
|
|
66
116
|
}
|
|
67
117
|
catch (error) {
|
|
68
|
-
|
|
69
|
-
await dispatch.writeError(error);
|
|
70
|
-
}
|
|
71
|
-
catch (replyError) {
|
|
72
|
-
// Spec 26 §3.1: a failed reply write means the reply delivery path is
|
|
73
|
-
// gone; `unexpected_reply` names a surplus/late reply instead.
|
|
74
|
-
this.report(dispatch.fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, replyError);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError, error);
|
|
118
|
+
this.replyPathMissing(dispatch.fields, error);
|
|
78
119
|
return;
|
|
79
120
|
}
|
|
80
|
-
|
|
81
|
-
await dispatch.writeReply(reply);
|
|
121
|
+
if (written === undefined) {
|
|
82
122
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, dispatch.fields);
|
|
123
|
+
return;
|
|
83
124
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
125
|
+
return written.then(() => this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Replied, dispatch.fields), (error) => this.replyPathMissing(dispatch.fields, error));
|
|
126
|
+
}
|
|
127
|
+
replyPathMissing(fields, error) {
|
|
128
|
+
// Spec 26 §3.1: a failed reply write means the reply delivery path is
|
|
129
|
+
// gone; `unexpected_reply` names a surplus/late reply instead.
|
|
130
|
+
this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop, error);
|
|
131
|
+
}
|
|
132
|
+
async failRequest(dispatch, error) {
|
|
133
|
+
try {
|
|
134
|
+
await dispatch.writeError(error);
|
|
88
135
|
}
|
|
136
|
+
catch (replyError) {
|
|
137
|
+
this.replyPathMissing(dispatch.fields, replyError);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
this.report(dispatch.fields, this.failureReason(error), ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.ReplyError, error);
|
|
89
141
|
}
|
|
90
142
|
dropMissingReplyPath(fields) {
|
|
91
143
|
this.report(fields, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorReason.ReplyPathMissing, ZLinkDispatchOptions_1.ZLinkRuntimeDispatchErrorAction.Drop);
|
|
@@ -99,8 +151,7 @@ class ZLinkChannelDispatchPipeline {
|
|
|
99
151
|
*/
|
|
100
152
|
async dispatchMalformed(input) {
|
|
101
153
|
const { info } = input;
|
|
102
|
-
const isRequest =
|
|
103
|
-
(info.kind === undefined && input.transportRequest);
|
|
154
|
+
const isRequest = input.transportRequest;
|
|
104
155
|
let replied = false;
|
|
105
156
|
if (isRequest && input.writeProtocolError !== undefined && info.correlationId !== undefined) {
|
|
106
157
|
const protocolError = new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, `Channel '${this.options.channelName}' received a malformed envelope.`);
|
|
@@ -126,15 +177,18 @@ class ZLinkChannelDispatchPipeline {
|
|
|
126
177
|
error: input.error
|
|
127
178
|
});
|
|
128
179
|
}
|
|
129
|
-
|
|
180
|
+
invoke(envelope, codecs, handler, context, fields, signal) {
|
|
130
181
|
(0, application_job_queue_scope_1.releaseApplicationJobPermitBeforeHandler)();
|
|
131
182
|
if (this.filters.length === 0) {
|
|
132
183
|
// Fast path for the dominant unfiltered dispatch: skip the filter
|
|
133
184
|
// context object and chain machinery entirely.
|
|
134
185
|
const payload = (0, channel_envelope_1.decodeChannelPayload)(envelope, codecs);
|
|
135
186
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, fields);
|
|
136
|
-
return
|
|
187
|
+
return handler.handle(payload, context);
|
|
137
188
|
}
|
|
189
|
+
return this.invokeFiltered(envelope, codecs, handler, context, fields, signal);
|
|
190
|
+
}
|
|
191
|
+
async invokeFiltered(envelope, codecs, handler, context, fields, signal) {
|
|
138
192
|
let value;
|
|
139
193
|
const handlerInvoked = await (0, handlers_1.invokeZLinkHandlerFilters)(this.filters, this.createFilterContext(context, fields), async () => {
|
|
140
194
|
// Filters are the channel admission gate. Decode only after they have
|
|
@@ -143,7 +197,7 @@ class ZLinkChannelDispatchPipeline {
|
|
|
143
197
|
this.trace(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Dispatched, fields);
|
|
144
198
|
value = await handler.handle(payload, context);
|
|
145
199
|
}, signal);
|
|
146
|
-
return
|
|
200
|
+
return handlerInvoked ? value : HANDLER_FILTER_REJECTED;
|
|
147
201
|
}
|
|
148
202
|
createFilterContext(context, fields) {
|
|
149
203
|
const dispatchKind = this.dispatchKind(context, fields);
|
|
@@ -222,6 +276,7 @@ class ZLinkChannelDispatchPipeline {
|
|
|
222
276
|
}
|
|
223
277
|
}
|
|
224
278
|
exports.ZLinkChannelDispatchPipeline = ZLinkChannelDispatchPipeline;
|
|
279
|
+
const HANDLER_FILTER_REJECTED = Symbol('handler-filter-rejected');
|
|
225
280
|
const DEFAULT_UNHANDLED_DISPATCH = {
|
|
226
281
|
request: contracts_1.ZLinkUnhandledDispatchAction.ReplyError,
|
|
227
282
|
send: contracts_1.ZLinkUnhandledDispatchAction.LogAndDrop,
|
|
@@ -43,6 +43,7 @@ export declare class ZLinkChannelDispatchServices {
|
|
|
43
43
|
channelSendHandler(handlerType: Type): ZLinkChannelSendHandler;
|
|
44
44
|
routeRequestHandler(handlerType: Type): ZLinkRouteRuntimeRequestHandler;
|
|
45
45
|
routeSendHandler(handlerType: Type): ZLinkRouteRuntimeSendHandler;
|
|
46
|
+
private invokeScopeFreeHandler;
|
|
46
47
|
private invokeHandlerFilters;
|
|
47
48
|
private withHandlerScope;
|
|
48
49
|
beginOutbound(outcome: ZLinkMessageFlowOutcome, result?: ZLinkRuntimeMessageFlowResult): ZLinkChannelOutboundTracePoint | undefined;
|