@zlink-systems/framework 0.26.0 → 0.28.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/Actors/ZLinkActorClient.d.ts +1 -1
- package/dist/contracts/Channels/Calls.d.ts +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/Builders.d.ts +0 -1
- package/dist/contracts/Configuration/Configs.d.ts +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 -5
- package/dist/contracts/Configuration/RegistrationValidators.js +15 -14
- 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 +2 -2
- package/dist/contracts/Streams/BoundSessionContracts.d.ts +1 -1
- package/dist/contracts/Streams/IZLinkSession.d.ts +2 -3
- package/dist/contracts/Streams/IZLinkSessionActor.d.ts +2 -2
- 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 +49 -153
- 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 +1 -0
- package/dist/runtime/actors/actor-request-deadline.js +6 -0
- package/dist/runtime/actors/actor-retry-delay.js +2 -1
- package/dist/runtime/actors/actor-routed-join-transport.d.ts +2 -3
- 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 +7 -27
- 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 +3 -1
- package/dist/runtime/backend/node/node-backend-adapter-support.js +51 -10
- 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 +1 -2
- 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 +41 -34
- 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 +4 -3
- 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 +73 -59
- package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
- package/dist/runtime/channels/channel-envelope.d.ts +1 -1
- package/dist/runtime/channels/channel-envelope.js +51 -39
- package/dist/runtime/channels/channel-outbound-operations.d.ts +5 -2
- package/dist/runtime/channels/channel-outbound-operations.js +25 -42
- package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
- package/dist/runtime/channels/channel-receive-loops.js +27 -6
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
- package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
- package/dist/runtime/channels/channel-runtime-manager.d.ts +4 -4
- package/dist/runtime/channels/channel-runtime-manager.js +13 -10
- package/dist/runtime/channels/channel-socket-options.js +3 -12
- package/dist/runtime/channels/channel-socket-registry.d.ts +14 -29
- package/dist/runtime/channels/channel-socket-registry.js +240 -177
- package/dist/runtime/channels/channel-transports.d.ts +21 -31
- package/dist/runtime/channels/channel-transports.js +80 -62
- 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/local-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/local-spot-route-transport.js +1 -3
- package/dist/runtime/channels/router-socket-spot-route-transport.d.ts +1 -1
- package/dist/runtime/channels/router-socket-spot-route-transport.js +2 -2
- package/dist/runtime/channels/source-spot-router.d.ts +1 -1
- package/dist/runtime/channels/source-spot-router.js +2 -4
- 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.d.ts +1 -1
- package/dist/runtime/channels/spot-node-route-transport.js +5 -5
- package/dist/runtime/channels/spot-route-bridge-transport.d.ts +1 -1
- package/dist/runtime/channels/spot-route-bridge-transport.js +2 -2
- package/dist/runtime/channels/spot-route-dispatch-strategy.d.ts +2 -4
- package/dist/runtime/channels/spot-route-dispatch-strategy.js +11 -12
- 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 +79 -94
- 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 +11 -8
- package/dist/runtime/host/actor-packet-relay.js +54 -99
- 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 -171
- 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 +15 -28
- 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 +3 -12
- package/dist/runtime/host/spot-address-transport.js +78 -220
- 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 +309 -336
- 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/request-deadline.d.ts +3 -0
- package/dist/runtime/messaging/request-deadline.js +39 -0
- package/dist/runtime/messaging/submission-result.d.ts +4 -0
- package/dist/runtime/messaging/submission-result.js +56 -1
- 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 +7 -8
- package/dist/runtime/spots/spot-outbound.js +21 -23
- 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 +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.js +65 -41
- package/dist/runtime/streams/bound-session-service.d.ts +7 -0
- package/dist/runtime/streams/bound-session-service.js +12 -2
- package/dist/runtime/streams/index.d.ts +16 -17
- package/dist/runtime/streams/index.js +22 -23
- package/dist/runtime/streams/managed-stream.d.ts +5 -2
- package/dist/runtime/streams/managed-stream.js +20 -13
- package/dist/runtime/streams/native-fallback-bound-session.js +14 -19
- 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 +6 -8
- package/dist/runtime/streams/session-calls.js +6 -22
- package/dist/runtime/streams/session-context.d.ts +10 -10
- package/dist/runtime/streams/session-context.js +25 -10
- 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/Actors/ZLinkActorClient.ts +1 -1
- package/src/contracts/Channels/Calls.ts +1 -1
- package/src/contracts/Common/CoreTypes.ts +7 -0
- package/src/contracts/Common/index.ts +1 -1
- package/src/contracts/Configuration/Builders.ts +0 -1
- package/src/contracts/Configuration/Configs.ts +0 -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 -71
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -5
- package/src/contracts/Configuration/RegistrationValidators.ts +19 -17
- 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 +2 -2
- package/src/contracts/Streams/BoundSessionContracts.ts +1 -1
- package/src/contracts/Streams/IZLinkSession.ts +2 -3
- package/src/contracts/Streams/IZLinkSessionActor.ts +2 -6
- 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 +85 -218
- 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 +4 -0
- package/src/runtime/actors/actor-retry-delay.ts +2 -1
- package/src/runtime/actors/actor-routed-join-transport.ts +3 -5
- 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 +14 -37
- 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 +67 -10
- package/src/runtime/backend/node/node-dealer-channel-client-transport.ts +0 -2
- 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 +44 -49
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +227 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +4 -3
- 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 +139 -102
- package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
- package/src/runtime/channels/channel-envelope.ts +74 -57
- package/src/runtime/channels/channel-outbound-operations.ts +40 -55
- 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 +12 -30
- package/src/runtime/channels/channel-socket-options.ts +8 -15
- package/src/runtime/channels/channel-socket-registry.ts +291 -196
- package/src/runtime/channels/channel-transports.ts +168 -145
- 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/local-spot-route-transport.ts +1 -5
- package/src/runtime/channels/router-socket-spot-route-transport.ts +2 -6
- package/src/runtime/channels/source-spot-router.ts +2 -9
- package/src/runtime/channels/spot-direct-envelope.ts +1 -1
- package/src/runtime/channels/spot-node-route-transport.ts +7 -9
- package/src/runtime/channels/spot-route-bridge-transport.ts +5 -12
- package/src/runtime/channels/spot-route-dispatch-strategy.ts +11 -30
- 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 +127 -125
- 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 +63 -160
- 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 -320
- 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 +16 -57
- 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 +175 -356
- 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 +457 -482
- 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/request-deadline.ts +58 -0
- package/src/runtime/messaging/submission-result.ts +72 -2
- 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 +59 -47
- 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 +98 -66
- package/src/runtime/streams/bound-session-service.ts +22 -2
- package/src/runtime/streams/index.ts +78 -68
- package/src/runtime/streams/managed-stream.ts +32 -23
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -28
- 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 +11 -36
- package/src/runtime/streams/session-context.ts +60 -25
- 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;
|
|
@@ -193,7 +194,7 @@ export function wrapSocket<T extends { close(): void }>(
|
|
|
193
194
|
}
|
|
194
195
|
return submitBindingAsyncSend(operation, payload);
|
|
195
196
|
},
|
|
196
|
-
submit(routingId: unknown, payload: unknown
|
|
197
|
+
submit(routingId: unknown, payload: unknown): Promise<void> {
|
|
197
198
|
if (!hasStream) throw new TypeError('Async stream send requires a STREAM socket.');
|
|
198
199
|
return submitBindingAsyncSend(
|
|
199
200
|
(nativeInstance as T & { send(routingId: unknown): ZLinkBindingAsyncSendOperation }).send(
|
|
@@ -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,
|
|
@@ -19,6 +20,7 @@ import {
|
|
|
19
20
|
import {
|
|
20
21
|
requireOneWayCompletion,
|
|
21
22
|
requirePublishCompletion,
|
|
23
|
+
requireClassicFanoutCompletion,
|
|
22
24
|
throwAlreadySubmitted,
|
|
23
25
|
ZLinkSubmitStatus,
|
|
24
26
|
type ZLinkSubmitResult
|
|
@@ -43,68 +45,76 @@ import {
|
|
|
43
45
|
} from '../spots/spot-outbound';
|
|
44
46
|
import { resolveFrameworkPacketName } from '../messaging/packet-name';
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
) {}
|
|
48
|
+
type RouteMeshChannelMatch = {
|
|
49
|
+
readonly meshName: string;
|
|
50
|
+
readonly mesh: NonNullable<ReturnType<ZLinkFrameworkRegistration['spotNodes']['get']>>;
|
|
51
|
+
};
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
53
|
+
type ChannelRouteResolution =
|
|
54
|
+
| {
|
|
55
|
+
readonly kind: 'client-server';
|
|
56
|
+
readonly channel: NonNullable<ReturnType<ZLinkFrameworkRegistration['channels']['get']>>;
|
|
57
|
+
}
|
|
58
|
+
| { readonly kind: 'route-mesh'; readonly matches: readonly RouteMeshChannelMatch[] };
|
|
59
|
+
|
|
60
|
+
type ResolvedChannelRoute =
|
|
61
|
+
| Extract<ChannelRouteResolution, { readonly kind: 'client-server' }>
|
|
62
|
+
| {
|
|
63
|
+
readonly kind: 'route-mesh';
|
|
64
|
+
readonly meshName: string;
|
|
65
|
+
readonly mesh: RouteMeshChannelMatch['mesh'];
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export function resolveChannelRoute(
|
|
69
|
+
registration: ZLinkFrameworkRegistration,
|
|
70
|
+
channelName: string
|
|
71
|
+
): ChannelRouteResolution | undefined {
|
|
72
|
+
const clientServerChannel = registration.channels.get(channelName);
|
|
73
|
+
if (clientServerChannel !== undefined) {
|
|
74
|
+
return { kind: 'client-server', channel: clientServerChannel };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const matches = [...registration.spotNodes.entries()]
|
|
78
|
+
.filter(([, mesh]) =>
|
|
79
|
+
Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
|
|
80
|
+
)
|
|
81
|
+
.map(([meshName, mesh]) => ({ meshName, mesh }));
|
|
82
|
+
return matches.length === 0 ? undefined : { kind: 'route-mesh', matches };
|
|
83
|
+
}
|
|
61
84
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
packetName,
|
|
69
|
-
request,
|
|
70
|
-
timeoutMs,
|
|
71
|
-
signal,
|
|
72
|
-
metadata
|
|
73
|
-
),
|
|
74
|
-
this.defaultRequestTimeout(channelName)
|
|
75
|
-
);
|
|
85
|
+
export function requireUniqueRouteMeshChannel(
|
|
86
|
+
matches: readonly RouteMeshChannelMatch[],
|
|
87
|
+
duplicateMessage: string
|
|
88
|
+
): RouteMeshChannelMatch {
|
|
89
|
+
if (matches.length !== 1) {
|
|
90
|
+
throw new ZLinkConfigurationException(duplicateMessage);
|
|
76
91
|
}
|
|
92
|
+
return matches[0]!;
|
|
93
|
+
}
|
|
77
94
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
95
|
+
export class DefaultZLinkChannelClient implements ZLinkChannelClient {
|
|
96
|
+
private readonly routeClient: DefaultZLinkRouteClient;
|
|
97
|
+
|
|
98
|
+
constructor(
|
|
99
|
+
registration: ZLinkFrameworkRegistration,
|
|
100
|
+
channelTransport?: ZLinkChannelClientTransportSource,
|
|
101
|
+
routeTransport?: ZLinkRouteClientTransport,
|
|
102
|
+
spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) => meshName
|
|
103
|
+
) {
|
|
104
|
+
this.routeClient = new DefaultZLinkRouteClient(
|
|
105
|
+
registration,
|
|
106
|
+
routeTransport,
|
|
107
|
+
spotRouterChannelIdForMesh,
|
|
108
|
+
channelTransport
|
|
83
109
|
);
|
|
84
110
|
}
|
|
85
111
|
|
|
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
|
-
}
|
|
112
|
+
sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
|
|
113
|
+
return this.routeClient.sendToChannel(channelName, message);
|
|
100
114
|
}
|
|
101
115
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (transport === undefined) {
|
|
105
|
-
throw new ZLinkConfigurationException('Channel runtime is not started.');
|
|
106
|
-
}
|
|
107
|
-
return transport;
|
|
116
|
+
requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
|
|
117
|
+
return this.routeClient.requestToChannel(channelName, request);
|
|
108
118
|
}
|
|
109
119
|
}
|
|
110
120
|
|
|
@@ -160,20 +170,20 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
160
170
|
private readonly registration: ZLinkFrameworkRegistration,
|
|
161
171
|
private readonly transport?: ZLinkRouteClientTransport,
|
|
162
172
|
private readonly spotRouterChannelIdForMesh: (meshName: string) => string = (meshName) =>
|
|
163
|
-
meshName
|
|
173
|
+
meshName,
|
|
174
|
+
private readonly channelTransport?: ZLinkChannelClientTransportSource
|
|
164
175
|
) {}
|
|
165
176
|
|
|
166
177
|
sendToNode(meshName: string, targetNodeRid: string, message: unknown): ZLinkSendCall {
|
|
167
178
|
return new DefaultZLinkSendCall(
|
|
168
179
|
() => this.requireMesh(meshName),
|
|
169
|
-
async (packetName, metadata
|
|
180
|
+
async (packetName, metadata) =>
|
|
170
181
|
normalizeSubmitResult(
|
|
171
182
|
await this.requireTransport().submit(
|
|
172
183
|
meshName,
|
|
173
184
|
targetNodeRid,
|
|
174
185
|
packetName,
|
|
175
186
|
message,
|
|
176
|
-
signal,
|
|
177
187
|
metadata
|
|
178
188
|
)
|
|
179
189
|
)
|
|
@@ -199,20 +209,22 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
199
209
|
|
|
200
210
|
sendToChannel(channelName: string, message: unknown): ZLinkSendCall {
|
|
201
211
|
return new DefaultZLinkSendCall(
|
|
202
|
-
() =>
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
212
|
+
() => this.requireChannelRoute(channelName),
|
|
213
|
+
async (packetName, metadata) => {
|
|
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
|
+
metadata
|
|
223
|
+
)
|
|
224
|
+
);
|
|
225
|
+
}
|
|
207
226
|
return normalizeSubmitResult(
|
|
208
|
-
await this.
|
|
209
|
-
meshName,
|
|
210
|
-
channelName,
|
|
211
|
-
packetName,
|
|
212
|
-
message,
|
|
213
|
-
signal,
|
|
214
|
-
metadata
|
|
215
|
-
)
|
|
227
|
+
await this.requireChannelTransport().send(channelName, packetName, message, metadata)
|
|
216
228
|
);
|
|
217
229
|
}
|
|
218
230
|
);
|
|
@@ -220,13 +232,21 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
220
232
|
|
|
221
233
|
requestToChannel(channelName: string, request: unknown): ZLinkChannelRequestCall {
|
|
222
234
|
return new DefaultZLinkRequestCall(
|
|
223
|
-
() =>
|
|
224
|
-
this.resolveMeshChannel(channelName);
|
|
225
|
-
},
|
|
235
|
+
() => this.requireChannelRoute(channelName),
|
|
226
236
|
(packetName, timeoutMs, metadata, signal) => {
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
237
|
+
const route = this.requireChannelRoute(channelName);
|
|
238
|
+
if (route.kind === 'route-mesh') {
|
|
239
|
+
return this.requireTransport().requestToChannel(
|
|
240
|
+
route.meshName,
|
|
241
|
+
channelName,
|
|
242
|
+
packetName,
|
|
243
|
+
request,
|
|
244
|
+
timeoutMs,
|
|
245
|
+
signal,
|
|
246
|
+
metadata
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
return this.requireChannelTransport().request(
|
|
230
250
|
channelName,
|
|
231
251
|
packetName,
|
|
232
252
|
request,
|
|
@@ -244,9 +264,8 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
244
264
|
() => {
|
|
245
265
|
this.requireSpotTransport();
|
|
246
266
|
},
|
|
247
|
-
async (_packetName, metadata
|
|
267
|
+
async (_packetName, metadata) => {
|
|
248
268
|
await sendToSpotHandle(this.requireSpotTransport(), spot, message, {
|
|
249
|
-
signal,
|
|
250
269
|
metadata,
|
|
251
270
|
spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
|
|
252
271
|
});
|
|
@@ -267,7 +286,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
267
286
|
metadata,
|
|
268
287
|
spotRouterChannelIdForMesh: this.spotRouterChannelIdForMesh
|
|
269
288
|
}),
|
|
270
|
-
this.registration.requestTimeoutMs ??
|
|
289
|
+
this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS
|
|
271
290
|
);
|
|
272
291
|
}
|
|
273
292
|
|
|
@@ -276,7 +295,7 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
276
295
|
this.registration.spotNodes.get(meshName)?.requestTimeoutMs ??
|
|
277
296
|
this.registration.routeChannelOptions.get(meshName)?.requestTimeoutMs ??
|
|
278
297
|
this.registration.requestTimeoutMs ??
|
|
279
|
-
|
|
298
|
+
DEFAULT_REQUEST_TIMEOUT_MS
|
|
280
299
|
);
|
|
281
300
|
}
|
|
282
301
|
|
|
@@ -289,31 +308,42 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
289
308
|
}
|
|
290
309
|
}
|
|
291
310
|
|
|
292
|
-
private
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
Object.prototype.hasOwnProperty.call(mesh.meshChannels ?? {}, channelName)
|
|
296
|
-
)
|
|
297
|
-
.map(([meshName]) => meshName);
|
|
298
|
-
if (matches.length === 0) {
|
|
311
|
+
private requireChannelRoute(channelName: string): ResolvedChannelRoute {
|
|
312
|
+
const resolution = resolveChannelRoute(this.registration, channelName);
|
|
313
|
+
if (resolution === undefined) {
|
|
299
314
|
throw createInternalFrameworkException(
|
|
300
315
|
ZLinkFrameworkInternalErrorKind.RequestTargetNotFound,
|
|
301
|
-
`
|
|
316
|
+
`ChannelName '${channelName}' is not registered.`
|
|
302
317
|
);
|
|
303
318
|
}
|
|
304
|
-
if (
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
319
|
+
if (resolution.kind === 'client-server') {
|
|
320
|
+
if (resolution.channel.client === undefined) {
|
|
321
|
+
throw createInternalFrameworkException(
|
|
322
|
+
ZLinkFrameworkInternalErrorKind.InvalidConfiguration,
|
|
323
|
+
`Channel client role '${channelName}' is not configured.`
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
return resolution;
|
|
308
327
|
}
|
|
309
|
-
|
|
328
|
+
|
|
329
|
+
return {
|
|
330
|
+
kind: 'route-mesh',
|
|
331
|
+
...requireUniqueRouteMeshChannel(
|
|
332
|
+
resolution.matches,
|
|
333
|
+
`RouteMesh channel '${channelName}' must be unique across the Framework host.`
|
|
334
|
+
)
|
|
335
|
+
};
|
|
310
336
|
}
|
|
311
337
|
|
|
312
338
|
private defaultRequestTimeoutForChannel(channelName: string): number {
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
339
|
+
const route = resolveChannelRoute(this.registration, channelName);
|
|
340
|
+
const timeoutMs =
|
|
341
|
+
route?.kind === 'client-server'
|
|
342
|
+
? route.channel.requestTimeoutMs
|
|
343
|
+
: route?.kind === 'route-mesh'
|
|
344
|
+
? route.matches[0]?.mesh.requestTimeoutMs
|
|
345
|
+
: undefined;
|
|
346
|
+
return timeoutMs ?? this.registration.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
317
347
|
}
|
|
318
348
|
|
|
319
349
|
private requireTransport(): ZLinkRouteClientTransport {
|
|
@@ -323,6 +353,15 @@ export class DefaultZLinkRouteClient implements ZLinkRouteClient {
|
|
|
323
353
|
return this.transport;
|
|
324
354
|
}
|
|
325
355
|
|
|
356
|
+
private requireChannelTransport(): ZLinkChannelClientTransport {
|
|
357
|
+
const transport =
|
|
358
|
+
typeof this.channelTransport === 'function' ? this.channelTransport() : this.channelTransport;
|
|
359
|
+
if (transport === undefined) {
|
|
360
|
+
throw new ZLinkConfigurationException('Channel runtime is not started.');
|
|
361
|
+
}
|
|
362
|
+
return transport;
|
|
363
|
+
}
|
|
364
|
+
|
|
326
365
|
private requireSpotTransport(): ZLinkSpotRoutedTransport {
|
|
327
366
|
const transport = this.requireTransport();
|
|
328
367
|
if (transport.sendToSpot === undefined || transport.requestToSpot === undefined) {
|
|
@@ -384,8 +423,7 @@ class DefaultZLinkSendCall implements ZLinkSendCall {
|
|
|
384
423
|
private readonly validate: () => void,
|
|
385
424
|
private readonly submitter: (
|
|
386
425
|
packetName: string | undefined,
|
|
387
|
-
metadata: ReadonlyMap<string, string
|
|
388
|
-
signal?: AbortSignal
|
|
426
|
+
metadata: ReadonlyMap<string, string>
|
|
389
427
|
) => Promise<ZLinkSubmitResult>
|
|
390
428
|
) {}
|
|
391
429
|
|
|
@@ -403,12 +441,11 @@ class DefaultZLinkSendCall implements ZLinkSendCall {
|
|
|
403
441
|
return this;
|
|
404
442
|
}
|
|
405
443
|
|
|
406
|
-
async submit(
|
|
444
|
+
async submit(): Promise<void> {
|
|
407
445
|
ensureNotExecuted(this.executed);
|
|
408
446
|
this.validate();
|
|
409
447
|
this.executed = true;
|
|
410
|
-
|
|
411
|
-
const result = await this.submitter(undefined, new Map(this.selectedMetadata), signal);
|
|
448
|
+
const result = await this.submitter(undefined, new Map(this.selectedMetadata));
|
|
412
449
|
requireOneWayCompletion(result, 'One-way send');
|
|
413
450
|
}
|
|
414
451
|
}
|
|
@@ -533,6 +570,6 @@ class DefaultZLinkFanoutPublishCall implements ZLinkFanoutPublishCall {
|
|
|
533
570
|
this.executed = true;
|
|
534
571
|
throwIfAborted(signal);
|
|
535
572
|
const result = await this.submitter(signal);
|
|
536
|
-
|
|
573
|
+
requireClassicFanoutCompletion(result, 'Classic fanout publish');
|
|
537
574
|
}
|
|
538
575
|
}
|
|
@@ -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';
|
|
@@ -84,33 +86,18 @@ export function encodeChannelEnvelopeParts(
|
|
|
84
86
|
createFlow = true,
|
|
85
87
|
metadata: ReadonlyMap<string, string> = EMPTY_OUTBOUND_METADATA
|
|
86
88
|
): readonly MessageLike[] {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
return encodeChannelEnvelopePartsAtDeadline(
|
|
90
|
+
kind,
|
|
91
|
+
channelName,
|
|
92
|
+
packetName,
|
|
89
93
|
payload,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
timeoutMs === undefined ? undefined : Date.now() + timeoutMs,
|
|
95
|
+
topic,
|
|
96
|
+
codecs,
|
|
97
|
+
correlationId,
|
|
98
|
+
createFlow,
|
|
99
|
+
metadata
|
|
93
100
|
);
|
|
94
|
-
const flow = createFlow ? currentOrCreateFlow('Application') : undefined;
|
|
95
|
-
const envelopeCorrelationId = correlationIdForOutboundKind(kind, correlationId);
|
|
96
|
-
return [
|
|
97
|
-
encodeChannelHeader(
|
|
98
|
-
kind,
|
|
99
|
-
channelName,
|
|
100
|
-
messageName,
|
|
101
|
-
encoded.contentType,
|
|
102
|
-
envelopeCorrelationId,
|
|
103
|
-
timeoutMs === undefined ? null : new Date(Date.now() + timeoutMs).toISOString(),
|
|
104
|
-
topic ?? null,
|
|
105
|
-
null,
|
|
106
|
-
null,
|
|
107
|
-
undefined,
|
|
108
|
-
applicationMetadataRecord(metadata),
|
|
109
|
-
flow?.flowId,
|
|
110
|
-
flow?.flowOrigin
|
|
111
|
-
),
|
|
112
|
-
encoded.message
|
|
113
|
-
];
|
|
114
101
|
}
|
|
115
102
|
|
|
116
103
|
/**
|
|
@@ -124,14 +111,17 @@ export function encodeChannelEnvelopePartsAtDeadline(
|
|
|
124
111
|
channelName: string,
|
|
125
112
|
packetName: string | undefined,
|
|
126
113
|
payload: unknown,
|
|
127
|
-
deadlineUnixMs: number,
|
|
114
|
+
deadlineUnixMs: number | undefined,
|
|
128
115
|
topic?: string,
|
|
129
116
|
codecs?: ZLinkChannelEnvelopeCodecRegistry,
|
|
130
117
|
correlationId?: string,
|
|
131
118
|
createFlow = true,
|
|
132
119
|
metadata: ReadonlyMap<string, string> = EMPTY_OUTBOUND_METADATA
|
|
133
120
|
): readonly MessageLike[] {
|
|
134
|
-
if (
|
|
121
|
+
if (
|
|
122
|
+
deadlineUnixMs !== undefined &&
|
|
123
|
+
(!Number.isSafeInteger(deadlineUnixMs) || deadlineUnixMs <= 0)
|
|
124
|
+
) {
|
|
135
125
|
throw new RangeError('deadlineUnixMs must be a positive safe integer.');
|
|
136
126
|
}
|
|
137
127
|
const messageName = resolveFrameworkPacketName(payload, packetName, 'Channel');
|
|
@@ -150,7 +140,7 @@ export function encodeChannelEnvelopePartsAtDeadline(
|
|
|
150
140
|
messageName,
|
|
151
141
|
encoded.contentType,
|
|
152
142
|
envelopeCorrelationId,
|
|
153
|
-
new Date(deadlineUnixMs).toISOString(),
|
|
143
|
+
deadlineUnixMs === undefined ? null : new Date(deadlineUnixMs).toISOString(),
|
|
154
144
|
topic ?? null,
|
|
155
145
|
null,
|
|
156
146
|
null,
|
|
@@ -614,7 +604,24 @@ function writeChannelHeader(
|
|
|
614
604
|
writer.append(',"source":');
|
|
615
605
|
writer.nullableString(source);
|
|
616
606
|
}
|
|
617
|
-
writer.append(',"metadata":
|
|
607
|
+
writer.append(',"metadata":');
|
|
608
|
+
writeApplicationMetadata(writer, metadata);
|
|
609
|
+
if (flowId !== undefined) {
|
|
610
|
+
writer.append(',"flowId":');
|
|
611
|
+
writer.string(flowId);
|
|
612
|
+
}
|
|
613
|
+
if (flowOrigin !== undefined) {
|
|
614
|
+
writer.append(',"flowOrigin":');
|
|
615
|
+
writer.append(String(encodeFlowOrigin(flowOrigin)));
|
|
616
|
+
}
|
|
617
|
+
writer.append('}');
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
function writeApplicationMetadata(
|
|
621
|
+
writer: ChannelHeaderWriter,
|
|
622
|
+
metadata: Readonly<Record<string, string>>
|
|
623
|
+
): void {
|
|
624
|
+
writer.append('{');
|
|
618
625
|
let first = true;
|
|
619
626
|
for (const name in metadata) {
|
|
620
627
|
if (!Object.prototype.hasOwnProperty.call(metadata, name)) continue;
|
|
@@ -625,15 +632,6 @@ function writeChannelHeader(
|
|
|
625
632
|
writer.string(metadata[name]!);
|
|
626
633
|
}
|
|
627
634
|
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
635
|
}
|
|
638
636
|
|
|
639
637
|
class ChannelHeaderWriter {
|
|
@@ -744,14 +742,20 @@ function parseWireJson(payload: string, schema?: ZLinkJsonSchema): unknown {
|
|
|
744
742
|
}
|
|
745
743
|
|
|
746
744
|
function parseChannelHeaderBytes(payload: Buffer): unknown {
|
|
747
|
-
|
|
745
|
+
if (!isUtf8(payload)) {
|
|
746
|
+
throw new ZLinkFrameworkException(
|
|
747
|
+
ZLinkFrameworkErrorKind.ProtocolError,
|
|
748
|
+
'Channel envelope header must contain valid UTF-8.'
|
|
749
|
+
);
|
|
750
|
+
}
|
|
751
|
+
return tryParseCanonicalChannelHeader(payload) ?? parseFrameworkJsonV1(payload.toString());
|
|
748
752
|
}
|
|
749
753
|
|
|
750
754
|
/**
|
|
751
755
|
* Accept the byte layout emitted by writeChannelHeader without materializing
|
|
752
756
|
* the enclosing JSON text. Any variation falls through to the established
|
|
753
757
|
* framework-json-v1 parser, which remains the sole authority for JSON
|
|
754
|
-
* failures
|
|
758
|
+
* failures and unknown properties. Header metadata accepts every valid string key.
|
|
755
759
|
*/
|
|
756
760
|
function tryParseCanonicalChannelHeader(payload: Buffer): Record<string, unknown> | undefined {
|
|
757
761
|
const reader = new CanonicalChannelHeaderReader(payload);
|
|
@@ -1019,38 +1023,51 @@ const EMPTY_APPLICATION_METADATA: Readonly<Record<string, string>> = Object.free
|
|
|
1019
1023
|
function applicationMetadataRecord(
|
|
1020
1024
|
metadata: ReadonlyMap<string, string>
|
|
1021
1025
|
): Readonly<Record<string, string>> {
|
|
1022
|
-
// The common case carries no metadata; skip the record + JSON.stringify
|
|
1023
|
-
// byte-limit walk entirely.
|
|
1024
1026
|
if (metadata.size === 0) return EMPTY_APPLICATION_METADATA;
|
|
1025
|
-
const record: Record<string, string> =
|
|
1026
|
-
for (const [key, value] of metadata)
|
|
1027
|
-
|
|
1027
|
+
const record: Record<string, string> = Object.create(null) as Record<string, string>;
|
|
1028
|
+
for (const [key, value] of metadata) record[key] = value;
|
|
1029
|
+
return validateApplicationMetadata(record);
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
const INVALID_METADATA_UNICODE =
|
|
1033
|
+
/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
|
|
1034
|
+
|
|
1035
|
+
function validateApplicationMetadata(
|
|
1036
|
+
metadata: Record<string, unknown>
|
|
1037
|
+
): Readonly<Record<string, string>> {
|
|
1038
|
+
const keys = Object.keys(metadata);
|
|
1039
|
+
if (keys.length === 0) return EMPTY_APPLICATION_METADATA;
|
|
1040
|
+
for (const key of keys) {
|
|
1041
|
+
const value = requireString(metadata[key], `metadata.${key}`);
|
|
1042
|
+
if (
|
|
1043
|
+
key.length === 0 ||
|
|
1044
|
+
key.includes('\0') ||
|
|
1045
|
+
value.includes('\0') ||
|
|
1046
|
+
INVALID_METADATA_UNICODE.test(key) ||
|
|
1047
|
+
INVALID_METADATA_UNICODE.test(value)
|
|
1048
|
+
) {
|
|
1028
1049
|
throw new ZLinkConfigurationException(
|
|
1029
|
-
'Channel application metadata keys must be non-empty and keys and values must
|
|
1050
|
+
'Channel application metadata keys must be non-empty and keys and values must be valid Unicode without NUL.'
|
|
1030
1051
|
);
|
|
1031
1052
|
}
|
|
1032
|
-
record[key] = value;
|
|
1033
1053
|
}
|
|
1034
|
-
|
|
1054
|
+
const record = metadata as Record<string, string>;
|
|
1055
|
+
const writer = new ChannelHeaderWriter();
|
|
1056
|
+
writeApplicationMetadata(writer, record);
|
|
1057
|
+
if (writer.byteLength > SERVICE_WIRE_METADATA_BYTES) {
|
|
1035
1058
|
throw new ZLinkConfigurationException(
|
|
1036
|
-
|
|
1059
|
+
`Channel application metadata exceeds the ${SERVICE_WIRE_METADATA_BYTES}-byte limit.`
|
|
1037
1060
|
);
|
|
1038
1061
|
}
|
|
1039
1062
|
return Object.freeze(record);
|
|
1040
1063
|
}
|
|
1041
1064
|
|
|
1042
1065
|
function requireApplicationMetadata(value: unknown): Readonly<Record<string, string>> {
|
|
1043
|
-
if (value === undefined)
|
|
1044
|
-
return Object.freeze({});
|
|
1045
|
-
}
|
|
1066
|
+
if (value === undefined) return EMPTY_APPLICATION_METADATA;
|
|
1046
1067
|
if (!isRecord(value)) {
|
|
1047
1068
|
throw new ZLinkConfigurationException('Channel application metadata must be a JSON object.');
|
|
1048
1069
|
}
|
|
1049
|
-
|
|
1050
|
-
for (const [key, selectedValue] of Object.entries(value)) {
|
|
1051
|
-
metadata.set(key, requireString(selectedValue, `metadata.${key}`));
|
|
1052
|
-
}
|
|
1053
|
-
return applicationMetadataRecord(metadata);
|
|
1070
|
+
return validateApplicationMetadata(value);
|
|
1054
1071
|
}
|
|
1055
1072
|
|
|
1056
1073
|
function optionalFlowId(value: unknown): string | undefined {
|