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