@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
|
@@ -6,6 +6,7 @@ exports.encodeChannelEnvelopeParts = encodeChannelEnvelopeParts;
|
|
|
6
6
|
exports.encodeChannelEnvelopePartsAtDeadline = encodeChannelEnvelopePartsAtDeadline;
|
|
7
7
|
exports.encodeChannelPublishEnvelopeParts = encodeChannelPublishEnvelopeParts;
|
|
8
8
|
exports.encodeChannelReplyParts = encodeChannelReplyParts;
|
|
9
|
+
exports.channelErrorKindFromCode = channelErrorKindFromCode;
|
|
9
10
|
exports.channelErrorCodeName = channelErrorCodeName;
|
|
10
11
|
exports.encodeChannelErrorReplyParts = encodeChannelErrorReplyParts;
|
|
11
12
|
exports.decodeChannelReply = decodeChannelReply;
|
|
@@ -13,6 +14,8 @@ exports.decodeChannelEnvelope = decodeChannelEnvelope;
|
|
|
13
14
|
exports.decodeChannelPayload = decodeChannelPayload;
|
|
14
15
|
exports.closeMessages = closeMessages;
|
|
15
16
|
exports.decodeChannelHeader = decodeChannelHeader;
|
|
17
|
+
exports.isValidChannelCorrelationId = isValidChannelCorrelationId;
|
|
18
|
+
const runtime_message_1 = require("../backend/runtime-message");
|
|
16
19
|
const node_crypto_1 = require("node:crypto");
|
|
17
20
|
const node_buffer_1 = require("node:buffer");
|
|
18
21
|
const contracts_1 = require("../../contracts");
|
|
@@ -34,8 +37,27 @@ exports.ZLINK_CHANNEL_FORMAT_MARKER = 0xf2;
|
|
|
34
37
|
const EMPTY_OUTBOUND_METADATA = new Map();
|
|
35
38
|
exports.JSON_CONTENT_TYPE = 'application/json';
|
|
36
39
|
exports.BINARY_CONTENT_TYPE = 'application/octet-stream';
|
|
40
|
+
const preparedChannelHeaders = new WeakMap();
|
|
41
|
+
const CHANNEL_CORRELATION_FIELD = ',"correlationId":';
|
|
42
|
+
const CHANNEL_DEADLINE_FIELD = ',"deadline":';
|
|
43
|
+
const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
|
|
44
|
+
const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
|
|
45
|
+
const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
|
|
46
|
+
const CHANNEL_CORRELATION_TEXT = /^[0-9a-f]{32}$/;
|
|
47
|
+
const CHANNEL_FLOW_FIELD = ',"flowId":';
|
|
48
|
+
// A flow id is a lowercase UUIDv7 (spec 27 §3): fixed 36 JSON-safe ASCII bytes.
|
|
49
|
+
const PREPARED_CHANNEL_FLOW = '00000000-0000-7000-8000-000000000000';
|
|
50
|
+
const CHANNEL_FLOW_TEXT = /^[0-9a-f-]{36}$/;
|
|
51
|
+
// A per-process random 64-bit prefix followed by a per-process counter, both
|
|
52
|
+
// as lowercase hex: unique among the runtime's pending requests (spec 06-obs/04
|
|
53
|
+
// §3) without drawing random bytes for every request — the shape Java
|
|
54
|
+
// ZLinkServiceOperationIds uses.
|
|
55
|
+
const CHANNEL_CORRELATION_PREFIX = (0, node_crypto_1.randomBytes)(CHANNEL_CORRELATION_TEXT_LENGTH / 4).toString('hex');
|
|
56
|
+
let channelCorrelationCounter = 0;
|
|
37
57
|
function newChannelCorrelationId() {
|
|
38
|
-
|
|
58
|
+
channelCorrelationCounter += 1;
|
|
59
|
+
return (CHANNEL_CORRELATION_PREFIX +
|
|
60
|
+
channelCorrelationCounter.toString(16).padStart(CHANNEL_CORRELATION_TEXT_LENGTH / 2, '0'));
|
|
39
61
|
}
|
|
40
62
|
function encodeChannelEnvelopeParts(kind, channelName, packetName, payload, timeoutMs, topic, codecs, correlationId, createFlow = true, metadata = EMPTY_OUTBOUND_METADATA) {
|
|
41
63
|
return encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, payload, timeoutMs === undefined ? undefined : Date.now() + timeoutMs, topic, codecs, correlationId, createFlow, metadata);
|
|
@@ -56,7 +78,7 @@ function encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, pay
|
|
|
56
78
|
const flow = createFlow ? (0, flow_context_1.currentOrCreateFlow)('Application') : undefined;
|
|
57
79
|
const envelopeCorrelationId = correlationIdForOutboundKind(kind, correlationId);
|
|
58
80
|
return [
|
|
59
|
-
encodeChannelHeader(kind, channelName, messageName, encoded.contentType, envelopeCorrelationId, deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(), topic ?? null, null, null, undefined, applicationMetadataRecord(metadata), flow?.flowId, flow?.flowOrigin),
|
|
81
|
+
encodeChannelHeader(kind, channelName, messageName, encoded.contentType, envelopeCorrelationId, deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(), topic ?? null, null, null, undefined, applicationMetadataRecord(metadata), flow?.flowId, flow?.flowOrigin, codecs),
|
|
60
82
|
encoded.message
|
|
61
83
|
];
|
|
62
84
|
}
|
|
@@ -72,7 +94,7 @@ function encodeChannelPublishEnvelopeParts(channelName, topic, packetName, paylo
|
|
|
72
94
|
function encodeChannelReplyParts(request, payload, codecs) {
|
|
73
95
|
const encoded = encodePayload(payload ?? Buffer.alloc(0), (0, channel_framework_packets_1.codecsForFrameworkPacket)(request.messageName, codecs), request.messageName, 'reply');
|
|
74
96
|
return [
|
|
75
|
-
encodeChannelHeader(2 /* ZLinkChannelMessageKind.Response */, request.channelName, request.messageName, encoded.contentType, request.correlationId, null, null, undefined, undefined, undefined, EMPTY_APPLICATION_METADATA, request.flowId, request.flowOrigin),
|
|
97
|
+
encodeChannelHeader(2 /* ZLinkChannelMessageKind.Response */, request.channelName, request.messageName, encoded.contentType, request.correlationId, null, null, undefined, undefined, undefined, EMPTY_APPLICATION_METADATA, request.flowId, request.flowOrigin, codecs),
|
|
76
98
|
encoded.message
|
|
77
99
|
];
|
|
78
100
|
}
|
|
@@ -105,6 +127,9 @@ const ERROR_KIND_WIRE_NAMES = [
|
|
|
105
127
|
'internal_failure' // 11
|
|
106
128
|
];
|
|
107
129
|
const ERROR_KIND_BY_WIRE_NAME = new Map(ERROR_KIND_WIRE_NAMES.map((name, kind) => [name, kind]));
|
|
130
|
+
function channelErrorKindFromCode(code) {
|
|
131
|
+
return ERROR_KIND_BY_WIRE_NAME.get(code);
|
|
132
|
+
}
|
|
108
133
|
function channelErrorCodeName(kind) {
|
|
109
134
|
return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
|
|
110
135
|
}
|
|
@@ -137,10 +162,10 @@ function decodeChannelReply(parts, codecs) {
|
|
|
137
162
|
return undefined;
|
|
138
163
|
}
|
|
139
164
|
if (header.contentType === exports.BINARY_CONTENT_TYPE) {
|
|
140
|
-
return
|
|
165
|
+
return runtime_message_1.ZLinkBufferMessage.retainPayload(parts[1]);
|
|
141
166
|
}
|
|
142
167
|
if (serializer !== undefined) {
|
|
143
|
-
return serializer.deserialize(
|
|
168
|
+
return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(parts[1].data()), Object);
|
|
144
169
|
}
|
|
145
170
|
return parseWireJson(parts[1].data().toString(), (0, Attributes_1.readZLinkPacketJsonContract)(header.messageName)?.reply);
|
|
146
171
|
}
|
|
@@ -155,7 +180,7 @@ function decodeChannelError(header) {
|
|
|
155
180
|
// Cross-language contract: errorCode carries the snake_case wire name.
|
|
156
181
|
// An unknown name degrades to InternalFailure, matching the C++
|
|
157
182
|
// request_failure_mapper fallback for unrecognized codes.
|
|
158
|
-
const publicKind =
|
|
183
|
+
const publicKind = channelErrorKindFromCode(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
|
|
159
184
|
failure = new contracts_1.ZLinkFrameworkException(publicKind, message);
|
|
160
185
|
}
|
|
161
186
|
// Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
|
|
@@ -197,7 +222,7 @@ function decodeChannelPayload(envelope, codecs) {
|
|
|
197
222
|
}
|
|
198
223
|
const serializer = codecs?.serializers.get(envelope.header.contentType);
|
|
199
224
|
if (serializer !== undefined) {
|
|
200
|
-
return serializer.deserialize(
|
|
225
|
+
return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(envelope.payload), Object);
|
|
201
226
|
}
|
|
202
227
|
if (envelope.header.contentType === exports.BINARY_CONTENT_TYPE) {
|
|
203
228
|
// The receive loop owns the Message for the duration of dispatch, so
|
|
@@ -270,7 +295,34 @@ function isMessage(value) {
|
|
|
270
295
|
function encodeJsonBytes(value, schema) {
|
|
271
296
|
return Buffer.from((0, framework_json_v1_1.stringifyFrameworkJsonV1)(value, schema));
|
|
272
297
|
}
|
|
273
|
-
function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
|
|
298
|
+
function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin, codecs) {
|
|
299
|
+
if (codecs !== undefined &&
|
|
300
|
+
metadata === EMPTY_APPLICATION_METADATA &&
|
|
301
|
+
(flowId === undefined
|
|
302
|
+
? flowOrigin === undefined
|
|
303
|
+
: flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
|
|
304
|
+
topic === null &&
|
|
305
|
+
source === undefined &&
|
|
306
|
+
((kind === 3 /* ZLinkChannelMessageKind.Command */ &&
|
|
307
|
+
correlationId === null &&
|
|
308
|
+
deadline === null &&
|
|
309
|
+
errorCode === null &&
|
|
310
|
+
errorMessage === null) ||
|
|
311
|
+
(kind === 1 /* ZLinkChannelMessageKind.Request */ &&
|
|
312
|
+
correlationId !== null &&
|
|
313
|
+
CHANNEL_CORRELATION_TEXT.test(correlationId) &&
|
|
314
|
+
deadline !== null &&
|
|
315
|
+
deadline.length === PREPARED_CHANNEL_DEADLINE.length &&
|
|
316
|
+
errorCode === null &&
|
|
317
|
+
errorMessage === null) ||
|
|
318
|
+
(kind === 2 /* ZLinkChannelMessageKind.Response */ &&
|
|
319
|
+
correlationId !== null &&
|
|
320
|
+
CHANNEL_CORRELATION_TEXT.test(correlationId) &&
|
|
321
|
+
deadline === null &&
|
|
322
|
+
errorCode === undefined &&
|
|
323
|
+
errorMessage === undefined))) {
|
|
324
|
+
return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin);
|
|
325
|
+
}
|
|
274
326
|
// The wire has a fixed field order. Measure escaped UTF-8 first, then write
|
|
275
327
|
// each field once into the only header Buffer: no header object, whole JSON
|
|
276
328
|
// string, or post-encode byte copy exists on the outbound path.
|
|
@@ -281,6 +333,49 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
|
|
|
281
333
|
writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin);
|
|
282
334
|
return result;
|
|
283
335
|
}
|
|
336
|
+
function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin) {
|
|
337
|
+
let channels = preparedChannelHeaders.get(codecs.serializers);
|
|
338
|
+
if (channels === undefined)
|
|
339
|
+
preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
|
|
340
|
+
let packets = channels.get(channelName);
|
|
341
|
+
if (packets === undefined)
|
|
342
|
+
channels.set(channelName, (packets = new Map()));
|
|
343
|
+
let contentTypes = packets.get(messageName);
|
|
344
|
+
if (contentTypes === undefined)
|
|
345
|
+
packets.set(messageName, (contentTypes = new Map()));
|
|
346
|
+
let kinds = contentTypes.get(contentType);
|
|
347
|
+
if (kinds === undefined)
|
|
348
|
+
contentTypes.set(contentType, (kinds = new Map()));
|
|
349
|
+
let deadlines = kinds.get(kind);
|
|
350
|
+
if (deadlines === undefined)
|
|
351
|
+
kinds.set(kind, (deadlines = new Map()));
|
|
352
|
+
const hasDeadline = deadline !== null;
|
|
353
|
+
let flows = deadlines.get(hasDeadline);
|
|
354
|
+
if (flows === undefined)
|
|
355
|
+
deadlines.set(hasDeadline, (flows = new Map()));
|
|
356
|
+
let prepared = flows.get(flowOrigin);
|
|
357
|
+
if (prepared === undefined) {
|
|
358
|
+
const bytes = encodeChannelHeader(kind, channelName, messageName, contentType, correlationId === null ? null : PREPARED_CHANNEL_CORRELATION, hasDeadline ? PREPARED_CHANNEL_DEADLINE : null, null, errorCode, errorMessage, undefined, EMPTY_APPLICATION_METADATA, flowOrigin === undefined ? undefined : PREPARED_CHANNEL_FLOW, flowOrigin);
|
|
359
|
+
prepared = {
|
|
360
|
+
bytes,
|
|
361
|
+
correlationOffset: bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
|
|
362
|
+
deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1,
|
|
363
|
+
flowOffset: bytes.indexOf(CHANNEL_FLOW_FIELD) + CHANNEL_FLOW_FIELD.length + 1
|
|
364
|
+
};
|
|
365
|
+
flows.set(flowOrigin, prepared);
|
|
366
|
+
}
|
|
367
|
+
if (correlationId === null && flowId === undefined)
|
|
368
|
+
return prepared.bytes;
|
|
369
|
+
const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
|
|
370
|
+
prepared.bytes.copy(bytes);
|
|
371
|
+
if (correlationId !== null)
|
|
372
|
+
bytes.write(correlationId, prepared.correlationOffset, CHANNEL_CORRELATION_TEXT_LENGTH, 'ascii');
|
|
373
|
+
if (deadline !== null)
|
|
374
|
+
bytes.write(deadline, prepared.deadlineOffset, PREPARED_CHANNEL_DEADLINE.length, 'ascii');
|
|
375
|
+
if (flowId !== undefined)
|
|
376
|
+
bytes.write(flowId, prepared.flowOffset, PREPARED_CHANNEL_FLOW.length, 'ascii');
|
|
377
|
+
return bytes;
|
|
378
|
+
}
|
|
284
379
|
function writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
|
|
285
380
|
writer.append('{"formatMarker":');
|
|
286
381
|
writer.append(String(exports.ZLINK_CHANNEL_FORMAT_MARKER));
|
|
@@ -292,9 +387,9 @@ function writeChannelHeader(writer, kind, channelName, messageName, contentType,
|
|
|
292
387
|
writer.string(messageName);
|
|
293
388
|
writer.append(',"contentType":');
|
|
294
389
|
writer.string(contentType);
|
|
295
|
-
writer.append(
|
|
390
|
+
writer.append(CHANNEL_CORRELATION_FIELD);
|
|
296
391
|
writer.nullableString(correlationId);
|
|
297
|
-
writer.append(
|
|
392
|
+
writer.append(CHANNEL_DEADLINE_FIELD);
|
|
298
393
|
writer.nullableString(deadline);
|
|
299
394
|
writer.append(',"topic":');
|
|
300
395
|
writer.nullableString(topic);
|
|
@@ -438,10 +533,16 @@ function parseWireJson(payload, schema) {
|
|
|
438
533
|
}, schema);
|
|
439
534
|
}
|
|
440
535
|
function parseChannelHeaderBytes(payload) {
|
|
536
|
+
const reader = new CanonicalChannelHeaderReader(payload);
|
|
537
|
+
const canonical = tryParseCanonicalChannelHeader(reader);
|
|
538
|
+
// An all-ASCII canonical header is valid UTF-8 by construction; any other
|
|
539
|
+
// header is checked before it is decoded.
|
|
540
|
+
if (canonical !== undefined && !reader.sawNonAscii)
|
|
541
|
+
return canonical;
|
|
441
542
|
if (!(0, node_buffer_1.isUtf8)(payload)) {
|
|
442
543
|
throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, 'Channel envelope header must contain valid UTF-8.');
|
|
443
544
|
}
|
|
444
|
-
return
|
|
545
|
+
return canonical ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
|
|
445
546
|
}
|
|
446
547
|
/**
|
|
447
548
|
* Accept the byte layout emitted by writeChannelHeader without materializing
|
|
@@ -449,8 +550,7 @@ function parseChannelHeaderBytes(payload) {
|
|
|
449
550
|
* framework-json-v1 parser, which remains the sole authority for JSON
|
|
450
551
|
* failures and unknown properties. Header metadata accepts every valid string key.
|
|
451
552
|
*/
|
|
452
|
-
function tryParseCanonicalChannelHeader(
|
|
453
|
-
const reader = new CanonicalChannelHeaderReader(payload);
|
|
553
|
+
function tryParseCanonicalChannelHeader(reader) {
|
|
454
554
|
if (!reader.consume('{"formatMarker":242,"kind":'))
|
|
455
555
|
return undefined;
|
|
456
556
|
const kind = reader.readSingleDigit();
|
|
@@ -484,25 +584,32 @@ function tryParseCanonicalChannelHeader(payload) {
|
|
|
484
584
|
deadline: deadline === NULL_JSON_STRING ? null : deadline,
|
|
485
585
|
topic: topic === NULL_JSON_STRING ? null : topic
|
|
486
586
|
};
|
|
487
|
-
if (!reader.readOptionalNullableString('errorCode', header))
|
|
587
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
|
|
488
588
|
return undefined;
|
|
489
|
-
if (!reader.readOptionalNullableString('errorMessage', header))
|
|
589
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
|
|
490
590
|
return undefined;
|
|
491
|
-
if (!reader.readOptionalNullableString('source', header))
|
|
591
|
+
if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header))
|
|
492
592
|
return undefined;
|
|
593
|
+
// Empty metadata validates to the shared empty record.
|
|
493
594
|
if (!reader.consume(',"metadata":{}'))
|
|
494
595
|
return undefined;
|
|
495
|
-
|
|
496
|
-
if (!reader.readOptionalString('flowId', header))
|
|
596
|
+
if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header))
|
|
497
597
|
return undefined;
|
|
498
|
-
if (!reader.readOptionalSingleDigit('flowOrigin', header))
|
|
598
|
+
if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
|
|
499
599
|
return undefined;
|
|
500
600
|
return reader.consume('}') && reader.atEnd() ? header : undefined;
|
|
501
601
|
}
|
|
602
|
+
const CANONICAL_ERROR_CODE = ',"errorCode":';
|
|
603
|
+
const CANONICAL_ERROR_MESSAGE = ',"errorMessage":';
|
|
604
|
+
const CANONICAL_SOURCE = ',"source":';
|
|
605
|
+
const CANONICAL_FLOW_ID = ',"flowId":';
|
|
606
|
+
const CANONICAL_FLOW_ORIGIN = ',"flowOrigin":';
|
|
502
607
|
const NULL_JSON_STRING = Symbol('null JSON string');
|
|
503
608
|
class CanonicalChannelHeaderReader {
|
|
504
609
|
bytes;
|
|
505
610
|
index = 0;
|
|
611
|
+
/** A string held a byte outside ASCII, so the caller must still check UTF-8. */
|
|
612
|
+
sawNonAscii = false;
|
|
506
613
|
constructor(bytes) {
|
|
507
614
|
this.bytes = bytes;
|
|
508
615
|
}
|
|
@@ -533,15 +640,22 @@ class CanonicalChannelHeaderReader {
|
|
|
533
640
|
return undefined;
|
|
534
641
|
const start = this.index;
|
|
535
642
|
this.index += 1;
|
|
643
|
+
let hasEscape = false;
|
|
536
644
|
while (this.index < this.bytes.length) {
|
|
537
645
|
const value = this.bytes[this.index++];
|
|
538
646
|
if (value === 0x22) {
|
|
539
|
-
|
|
647
|
+
// Without escapes the JSON string is its own bytes; decode them once.
|
|
648
|
+
return hasEscape
|
|
649
|
+
? JSON.parse(this.bytes.toString('utf8', start, this.index))
|
|
650
|
+
: this.bytes.toString(this.sawNonAscii ? 'utf8' : 'latin1', start + 1, this.index - 1);
|
|
540
651
|
}
|
|
541
652
|
if (value < 0x20)
|
|
542
653
|
return undefined;
|
|
654
|
+
if (value >= 0x80)
|
|
655
|
+
this.sawNonAscii = true;
|
|
543
656
|
if (value !== 0x5c)
|
|
544
657
|
continue;
|
|
658
|
+
hasEscape = true;
|
|
545
659
|
if (this.index === this.bytes.length)
|
|
546
660
|
return undefined;
|
|
547
661
|
const escaped = this.bytes[this.index++];
|
|
@@ -572,8 +686,8 @@ class CanonicalChannelHeaderReader {
|
|
|
572
686
|
return NULL_JSON_STRING;
|
|
573
687
|
return this.readString();
|
|
574
688
|
}
|
|
575
|
-
readOptionalNullableString(name, target) {
|
|
576
|
-
if (!this.consume(
|
|
689
|
+
readOptionalNullableString(token, name, target) {
|
|
690
|
+
if (!this.consume(token))
|
|
577
691
|
return true;
|
|
578
692
|
const value = this.readNullableString();
|
|
579
693
|
if (value === undefined)
|
|
@@ -581,8 +695,8 @@ class CanonicalChannelHeaderReader {
|
|
|
581
695
|
target[name] = value === NULL_JSON_STRING ? null : value;
|
|
582
696
|
return true;
|
|
583
697
|
}
|
|
584
|
-
readOptionalString(name, target) {
|
|
585
|
-
if (!this.consume(
|
|
698
|
+
readOptionalString(token, name, target) {
|
|
699
|
+
if (!this.consume(token))
|
|
586
700
|
return true;
|
|
587
701
|
const value = this.readString();
|
|
588
702
|
if (value === undefined)
|
|
@@ -590,8 +704,8 @@ class CanonicalChannelHeaderReader {
|
|
|
590
704
|
target[name] = value;
|
|
591
705
|
return true;
|
|
592
706
|
}
|
|
593
|
-
readOptionalSingleDigit(name, target) {
|
|
594
|
-
if (!this.consume(
|
|
707
|
+
readOptionalSingleDigit(token, name, target) {
|
|
708
|
+
if (!this.consume(token))
|
|
595
709
|
return true;
|
|
596
710
|
const value = this.readSingleDigit();
|
|
597
711
|
if (value === undefined)
|
|
@@ -681,9 +795,13 @@ function validateCorrelationForKind(kind, correlationId) {
|
|
|
681
795
|
throw new configuration_1.ZLinkConfigurationException(`Channel ${channelKindName(kind)} must not contain correlationId.`);
|
|
682
796
|
}
|
|
683
797
|
}
|
|
798
|
+
const MAXIMUM_CORRELATION_ID_BYTES = 64;
|
|
799
|
+
function isValidChannelCorrelationId(value) {
|
|
800
|
+
const byteLength = Buffer.byteLength(value, 'utf8');
|
|
801
|
+
return (byteLength >= 1 && byteLength <= MAXIMUM_CORRELATION_ID_BYTES && /^[\x00-\x7f]*$/.test(value));
|
|
802
|
+
}
|
|
684
803
|
function validateCorrelationValue(correlationId) {
|
|
685
|
-
|
|
686
|
-
if (byteLength < 1 || byteLength > 64 || !/^[\x00-\x7f]*$/.test(correlationId)) {
|
|
804
|
+
if (!isValidChannelCorrelationId(correlationId)) {
|
|
687
805
|
throw new configuration_1.ZLinkConfigurationException('Channel envelope correlationId must be a non-empty ASCII value of at most 64 bytes.');
|
|
688
806
|
}
|
|
689
807
|
}
|
|
@@ -13,7 +13,7 @@ export declare class ZLinkChannelOutboundOperations {
|
|
|
13
13
|
send(channelName: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
14
14
|
private sendScoped;
|
|
15
15
|
private traceSend;
|
|
16
|
-
request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string
|
|
16
|
+
request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
17
17
|
private requestScoped;
|
|
18
18
|
tryPublish(channelName: string, topic: string, packetName: string | undefined, event: unknown, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
|
|
19
19
|
private tryPublishScoped;
|
|
@@ -22,7 +22,7 @@ export declare class ZLinkChannelOutboundOperations {
|
|
|
22
22
|
routeSubmit(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
23
23
|
private routeSubmitScoped;
|
|
24
24
|
private traceRouteSend;
|
|
25
|
-
routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string
|
|
25
|
+
routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
26
26
|
private routeRequestScoped;
|
|
27
27
|
private measureRequest;
|
|
28
28
|
}
|
|
@@ -68,10 +68,10 @@ class ZLinkChannelOutboundOperations {
|
|
|
68
68
|
correlationId: undefined
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
request(channelName, packetName, request, timeoutMs, signal, metadata) {
|
|
72
|
-
return keepChannelRequestAlive((0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.requestScoped(channelName, packetName, request, timeoutMs, signal, metadata)));
|
|
71
|
+
request(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
|
|
72
|
+
return keepChannelRequestAlive((0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.requestScoped(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted)));
|
|
73
73
|
}
|
|
74
|
-
async requestScoped(channelName, packetName, request, timeoutMs, signal, metadata) {
|
|
74
|
+
async requestScoped(channelName, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
|
|
75
75
|
const deadlineMs = timeoutMs === undefined ? undefined : performance.now() + timeoutMs;
|
|
76
76
|
const deadlineUnixMs = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
|
|
77
77
|
let correlationId;
|
|
@@ -117,7 +117,7 @@ class ZLinkChannelOutboundOperations {
|
|
|
117
117
|
let replyParts = [];
|
|
118
118
|
try {
|
|
119
119
|
try {
|
|
120
|
-
replyParts = await (0, abort_1.awaitWithAbort)(dealer.request(parts, (0, request_deadline_1.remainingRequestTimeout)(`Channel request '${channelName}'`, deadlineMs)), signal);
|
|
120
|
+
replyParts = await (0, abort_1.awaitWithAbort)(dealer.request(parts, (0, request_deadline_1.remainingRequestTimeout)(`Channel request '${channelName}'`, deadlineMs), onAdmitted), signal);
|
|
121
121
|
}
|
|
122
122
|
catch (error) {
|
|
123
123
|
if (signal?.aborted === true)
|
|
@@ -205,10 +205,10 @@ class ZLinkChannelOutboundOperations {
|
|
|
205
205
|
targetRid: targetNodeRid
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
|
-
routeRequest(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata) {
|
|
209
|
-
return (0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata));
|
|
208
|
+
routeRequest(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
|
|
209
|
+
return (0, flow_context_1.runWithOutboundFlow)(this.dispatchServices.flowCreationEnabled(), () => this.routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted));
|
|
210
210
|
}
|
|
211
|
-
async routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata) {
|
|
211
|
+
async routeRequestScoped(routerChannelId, targetNodeRid, packetName, request, timeoutMs, signal, metadata, onAdmitted) {
|
|
212
212
|
let correlationId;
|
|
213
213
|
let router;
|
|
214
214
|
let terminalRecorded = false;
|
|
@@ -245,7 +245,7 @@ class ZLinkChannelOutboundOperations {
|
|
|
245
245
|
targetRid: targetNodeRid
|
|
246
246
|
});
|
|
247
247
|
const reply = await this.measureRequest(routerChannelId, async () => {
|
|
248
|
-
const replyParts = await (0, abort_1.awaitWithAbort)(router.request(targetNodeRid, parts, timeoutMs), signal);
|
|
248
|
+
const replyParts = await (0, abort_1.awaitWithAbort)(router.request(targetNodeRid, parts, timeoutMs, onAdmitted), signal);
|
|
249
249
|
try {
|
|
250
250
|
return (0, channel_envelope_1.decodeChannelReply)(replyParts, this.codecs);
|
|
251
251
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
2
3
|
import type { ZLinkFrameworkRegistration } from '../configuration';
|
|
3
4
|
import type { ZLinkBackendSpotRouteBridge, ZLinkChannelBackendAdapter } from '../backend/contracts';
|
|
@@ -49,7 +50,7 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
49
50
|
lifecycleGeneration: bigint;
|
|
50
51
|
descriptorRevision: bigint;
|
|
51
52
|
advertisedEndpoint: string;
|
|
52
|
-
state: "error" | "preparing" | "serving" | "
|
|
53
|
+
state: "error" | "preparing" | "serving" | "stopped" | "retiring";
|
|
53
54
|
}[] | undefined;
|
|
54
55
|
configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
|
|
55
56
|
private beginLocationAutoConnectCore;
|
|
@@ -60,8 +61,8 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
60
61
|
bindRouteMeshRouters(): void;
|
|
61
62
|
start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
|
|
62
63
|
prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
|
|
63
|
-
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
64
|
-
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
64
|
+
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
65
|
+
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
65
66
|
dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
|
|
66
67
|
canDispatchLocalMeshRoute(meshName: string): boolean;
|
|
67
68
|
dispose(signal?: AbortSignal): Promise<void>;
|
|
@@ -10,9 +10,7 @@ const channel_receive_loops_1 = require("./channel-receive-loops");
|
|
|
10
10
|
const client_server_location_runtime_1 = require("./client-server-location-runtime");
|
|
11
11
|
const fanout_location_runtime_1 = require("./fanout-location-runtime");
|
|
12
12
|
const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
|
|
13
|
-
const node_async_hooks_1 = require("node:async_hooks");
|
|
14
13
|
const state_lane_1 = require("../execution/state-lane");
|
|
15
|
-
const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:channel-runtime-lifecycle');
|
|
16
14
|
class ZLinkChannelRuntimeLifecycle {
|
|
17
15
|
options;
|
|
18
16
|
lane = new state_lane_1.ZLinkStateLane();
|
|
@@ -74,12 +72,12 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
74
72
|
return;
|
|
75
73
|
let fanoutLocation;
|
|
76
74
|
try {
|
|
77
|
-
await startOutsideStateLane(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
|
|
75
|
+
await (0, state_lane_1.startOutsideStateLane)(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
|
|
78
76
|
fanoutLocation = await this.lane.run(() => this.beginFanoutLocationAutoConnectCore(start));
|
|
79
|
-
await startOutsideStateLane(() => fanoutLocation?.start(signal) ?? Promise.resolve());
|
|
77
|
+
await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.start(signal) ?? Promise.resolve());
|
|
80
78
|
}
|
|
81
79
|
catch (error) {
|
|
82
|
-
await startOutsideStateLane(() => Promise.all([
|
|
80
|
+
await (0, state_lane_1.startOutsideStateLane)(() => Promise.all([
|
|
83
81
|
start.clientServerLocation?.stop(signal).catch(() => undefined),
|
|
84
82
|
fanoutLocation?.stop(signal).catch(() => undefined)
|
|
85
83
|
]));
|
|
@@ -89,9 +87,9 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
89
87
|
}
|
|
90
88
|
async reclaimLocationOwnerRows(signal) {
|
|
91
89
|
const clientServerLocation = await this.lane.run(() => this.clientServerLocation);
|
|
92
|
-
await startOutsideStateLane(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
90
|
+
await (0, state_lane_1.startOutsideStateLane)(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
93
91
|
const fanoutLocation = await this.lane.run(() => this.fanoutLocation);
|
|
94
|
-
await startOutsideStateLane(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
92
|
+
await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
95
93
|
}
|
|
96
94
|
bindRouteMeshRouters() {
|
|
97
95
|
for (const routeChannel of this.options.registration.routeChannelOptions.values()) {
|
|
@@ -178,7 +176,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
}
|
|
181
|
-
dispatchMeshChannel(meshName, record, signal) {
|
|
179
|
+
dispatchMeshChannel(meshName, record, signal, admit) {
|
|
182
180
|
const channelName = record.channelName;
|
|
183
181
|
if (channelName === null) {
|
|
184
182
|
throw new configuration_1.ZLinkConfigurationException('MeshNode channel record is missing channelName.');
|
|
@@ -187,14 +185,14 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
187
185
|
if (dispatcher === undefined) {
|
|
188
186
|
throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' channel '${channelName}' has no registered handlers.`);
|
|
189
187
|
}
|
|
190
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
188
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
191
189
|
}
|
|
192
|
-
dispatchMeshRoute(meshName, record, signal) {
|
|
190
|
+
dispatchMeshRoute(meshName, record, signal, admit) {
|
|
193
191
|
const dispatcher = this.meshRouteDispatchers.get(meshName);
|
|
194
192
|
if (dispatcher === undefined) {
|
|
195
193
|
throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' has no registered node-direct handlers.`);
|
|
196
194
|
}
|
|
197
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
195
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
198
196
|
}
|
|
199
197
|
dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal) {
|
|
200
198
|
const dispatcher = this.meshRouteDispatchers.get(meshName);
|
|
@@ -211,20 +209,20 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
211
209
|
}
|
|
212
210
|
async disposeCore(signal) {
|
|
213
211
|
const work = await this.lane.run(() => this.beginDisposeCore());
|
|
214
|
-
const transportStopped = await startOutsideStateLane(() => Promise.allSettled([
|
|
212
|
+
const transportStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
|
|
215
213
|
...work.channelLoops.map((loop) => loop.stop()),
|
|
216
214
|
...work.subscriberLoops.map((loop) => loop.stop()),
|
|
217
215
|
...work.routeLoops.map((loop) => loop.stop()),
|
|
218
216
|
...work.manualTransitions
|
|
219
217
|
]));
|
|
220
|
-
const applicationStopped = await startOutsideStateLane(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
|
|
218
|
+
const applicationStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
|
|
221
219
|
const descriptorStopped = work.clientServerLocation === undefined
|
|
222
220
|
? []
|
|
223
|
-
: await startOutsideStateLane(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
|
|
221
|
+
: await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
|
|
224
222
|
const fanoutDescriptorStopped = work.fanoutLocation === undefined
|
|
225
223
|
? []
|
|
226
|
-
: await startOutsideStateLane(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
|
|
227
|
-
const cleanup = await startOutsideStateLane(() => Promise.allSettled([
|
|
224
|
+
: await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
|
|
225
|
+
const cleanup = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
|
|
228
226
|
...work.spotRouteBridges.map((bridge) => bridge.dispose()),
|
|
229
227
|
this.options.sockets.dispose()
|
|
230
228
|
]));
|
|
@@ -421,7 +419,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
421
419
|
}
|
|
422
420
|
enqueueManualFanoutTransition(state, transition) {
|
|
423
421
|
state.transition = state.transition
|
|
424
|
-
.then(() => startOutsideStateLane(transition), () => startOutsideStateLane(transition))
|
|
422
|
+
.then(() => (0, state_lane_1.startOutsideStateLane)(transition), () => (0, state_lane_1.startOutsideStateLane)(transition))
|
|
425
423
|
.catch((error) => state.taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:lifecycle`, error));
|
|
426
424
|
}
|
|
427
425
|
openManualFanoutSubscriber(state) {
|
|
@@ -489,13 +487,13 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
489
487
|
return;
|
|
490
488
|
const errors = [];
|
|
491
489
|
try {
|
|
492
|
-
await startOutsideStateLane(() => active.loop.stop());
|
|
490
|
+
await (0, state_lane_1.startOutsideStateLane)(() => active.loop.stop());
|
|
493
491
|
}
|
|
494
492
|
catch (error) {
|
|
495
493
|
errors.push(error);
|
|
496
494
|
}
|
|
497
495
|
try {
|
|
498
|
-
await startOutsideStateLane(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
|
|
496
|
+
await (0, state_lane_1.startOutsideStateLane)(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
|
|
499
497
|
}
|
|
500
498
|
catch (error) {
|
|
501
499
|
errors.push(error);
|
|
@@ -524,7 +522,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
524
522
|
state.stopping = undefined;
|
|
525
523
|
}
|
|
526
524
|
drainManualFanoutSubscriberCore(state) {
|
|
527
|
-
state.transition = state.transition.then(() => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)), () => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)));
|
|
525
|
+
state.transition = state.transition.then(() => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)), () => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)));
|
|
528
526
|
return state.transition;
|
|
529
527
|
}
|
|
530
528
|
startFanoutSubscriberLoop(channelName, connectionId, subscriber) {
|
|
@@ -546,7 +544,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
546
544
|
this.subscriberReceiveLoops.push(loop);
|
|
547
545
|
void taskRunner.run(`subscriber:${channelName}:automatic:${connectionId}`, (signal) => loop.run(signal));
|
|
548
546
|
return async () => {
|
|
549
|
-
await startOutsideStateLane(() => loop.stop());
|
|
547
|
+
await (0, state_lane_1.startOutsideStateLane)(() => loop.stop());
|
|
550
548
|
await this.lane.run(() => this.removeSubscriberReceiveLoopCore(loop));
|
|
551
549
|
};
|
|
552
550
|
}
|
|
@@ -651,6 +649,3 @@ function hasFanoutLocationTopology(registration) {
|
|
|
651
649
|
}
|
|
652
650
|
return false;
|
|
653
651
|
}
|
|
654
|
-
function startOutsideStateLane(work) {
|
|
655
|
-
return detachedStateLaneResource.runInAsyncScope(work);
|
|
656
|
-
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import type { ZLinkListenerRecords } from '../foundation/listener-records';
|
|
2
3
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
3
4
|
import type { RoutingId } from '../../contracts';
|
|
@@ -40,22 +41,22 @@ export declare class ZLinkChannelRuntimeManager {
|
|
|
40
41
|
openMonitoringSource(sourceName: string, adapter: ZLinkMonitoringBackendAdapter): ZLinkBackendSocketMonitor;
|
|
41
42
|
start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
|
|
42
43
|
prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
|
|
43
|
-
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
44
|
-
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
44
|
+
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
45
|
+
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
45
46
|
dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
|
|
46
47
|
canDispatchLocalMeshRoute(meshName: string): boolean;
|
|
47
48
|
send(channelName: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
48
|
-
request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string
|
|
49
|
+
request<TReply>(channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
49
50
|
tryPublish(channelName: string, topic: string, packetName: string | undefined, event: unknown, metadata?: ReadonlyMap<string, string>): ZLinkSubmitResult;
|
|
50
51
|
publish(channelName: string, topic: string, packetName: string | undefined, event: unknown, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
51
52
|
routeSubmit(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
52
|
-
routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string
|
|
53
|
+
routeRequest<TReply>(routerChannelId: string, targetNodeRid: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
53
54
|
routeSendToSpot(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
|
|
54
|
-
routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string
|
|
55
|
-
routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal): Promise<TReply>;
|
|
55
|
+
routeRequestToSpot<TReply>(spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
56
|
+
routeRequestFromSpotToSpot<TReply>(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<TReply>;
|
|
56
57
|
routeSendFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<void>;
|
|
57
|
-
routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
|
|
58
|
-
routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal): Promise<readonly Message[]>;
|
|
58
|
+
routeRequestRawFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
|
|
59
|
+
routeRequestRawToSpot(spotRouteTarget: ZLinkSpotRouteTarget, request: Message, timeoutMs: number | undefined, signal?: AbortSignal, onAdmitted?: () => void): Promise<readonly Message[]>;
|
|
59
60
|
canRouteChannel(routerChannelId: string): boolean;
|
|
60
61
|
canRoutePacketChannel(routerChannelId: string): boolean;
|
|
61
62
|
dispose(signal?: AbortSignal): Promise<void>;
|