@zlink-systems/framework 0.30.1 → 0.30.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/contracts/Common/ZLinkEncodedPayload.d.ts +6 -0
- package/dist/contracts/Common/ZLinkEncodedPayload.js +18 -3
- package/dist/contracts/Common/encoded-payload-storage.d.ts +1 -1
- package/dist/contracts/Common/encoded-payload-storage.js +5 -2
- package/dist/contracts/Configuration/Builders.d.ts +1 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +2 -1
- package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +5 -1
- package/dist/contracts/Configuration/RegistrationBuilders.js +2 -2
- package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
- package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +2 -2
- package/dist/contracts/Locations/Rows.d.ts +2 -0
- package/dist/contracts/Spots/Contracts.d.ts +4 -0
- package/dist/contracts/Spots/ZLinkSpot.d.ts +3 -3
- package/dist/runtime/abort.d.ts +5 -0
- package/dist/runtime/abort.js +10 -0
- package/dist/runtime/actors/actor-authority-publication.js +3 -2
- package/dist/runtime/actors/actor-client.d.ts +0 -1
- package/dist/runtime/actors/actor-client.js +38 -45
- package/dist/runtime/actors/actor-context.d.ts +2 -0
- package/dist/runtime/actors/actor-context.js +46 -9
- package/dist/runtime/actors/actor-handoff.d.ts +7 -3
- package/dist/runtime/actors/actor-handoff.js +212 -88
- package/dist/runtime/actors/actor-join-relocation.d.ts +2 -0
- package/dist/runtime/actors/actor-local-native-join.js +4 -0
- package/dist/runtime/actors/actor-mailbox.js +27 -1
- package/dist/runtime/actors/actor-remote-joiner.js +3 -1
- package/dist/runtime/actors/actor-reply.d.ts +4 -0
- package/dist/runtime/actors/actor-reply.js +29 -0
- package/dist/runtime/actors/actor-runtime-contracts.d.ts +2 -0
- package/dist/runtime/actors/actor-runtime-state.js +2 -20
- package/dist/runtime/actors/actor-source-transfer.d.ts +1 -17
- package/dist/runtime/actors/index.d.ts +6 -2
- package/dist/runtime/actors/index.js +37 -21
- package/dist/runtime/actors/session-disconnected-wire.d.ts +8 -0
- package/dist/runtime/actors/session-disconnected-wire.js +48 -0
- package/dist/runtime/admission.d.ts +9 -1
- package/dist/runtime/admission.js +55 -32
- package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +13 -0
- package/dist/runtime/application-jobs/application-job-queue-scope.js +27 -1
- package/dist/runtime/application-jobs/contracts.d.ts +2 -0
- package/dist/runtime/backend/contracts/index.d.ts +19 -3
- package/dist/runtime/backend/mesh-actor-session-node-adapter.js +2 -2
- package/dist/runtime/backend/mesh-completion-table.js +5 -0
- package/dist/runtime/backend/mesh-dispatch-pump.d.ts +26 -2
- package/dist/runtime/backend/mesh-dispatch-pump.js +193 -107
- package/dist/runtime/backend/node/node-raw-binding-port.js +90 -58
- package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +33 -8
- package/dist/runtime/backend/node/node-raw-mesh-backend.js +142 -143
- package/dist/runtime/backend/node/node-socket-backend-adapter.d.ts +1 -1
- package/dist/runtime/backend/node/node-socket-backend-adapter.js +5 -5
- package/dist/runtime/channels/channel-clients.d.ts +1 -0
- package/dist/runtime/channels/channel-clients.js +20 -5
- package/dist/runtime/channels/channel-dispatch-pipeline.d.ts +22 -3
- package/dist/runtime/channels/channel-dispatch-pipeline.js +103 -57
- package/dist/runtime/channels/channel-dispatchers.d.ts +3 -2
- package/dist/runtime/channels/channel-dispatchers.js +44 -37
- package/dist/runtime/channels/channel-envelope.d.ts +1 -0
- package/dist/runtime/channels/channel-envelope.js +74 -31
- package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +4 -3
- package/dist/runtime/channels/channel-runtime-lifecycle.js +19 -24
- package/dist/runtime/channels/channel-runtime-manager.d.ts +3 -2
- package/dist/runtime/channels/channel-runtime-manager.js +4 -4
- package/dist/runtime/channels/channel-transports.d.ts +0 -1
- package/dist/runtime/channels/channel-transports.js +35 -33
- package/dist/runtime/channels/client-server-location-runtime.js +5 -4
- package/dist/runtime/channels/dispatch-error-reporter.d.ts +2 -1
- package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
- package/dist/runtime/channels/fanout-location-runtime.d.ts +1 -1
- package/dist/runtime/channels/fanout-location-runtime.js +3 -3
- package/dist/runtime/diagnostics/flow-context.js +19 -7
- package/dist/runtime/diagnostics/index.js +4 -9
- package/dist/runtime/diagnostics/message-flow.d.ts +8 -0
- package/dist/runtime/diagnostics/message-flow.js +35 -5
- package/dist/runtime/diagnostics/runtime-metrics.d.ts +2 -2
- package/dist/runtime/diagnostics/runtime-metrics.js +10 -8
- package/dist/runtime/execution/index.d.ts +4 -2
- package/dist/runtime/execution/index.js +33 -10
- package/dist/runtime/execution/serial-execution-queue.d.ts +4 -0
- package/dist/runtime/execution/serial-execution-queue.js +21 -2
- package/dist/runtime/execution/state-lane.d.ts +2 -0
- package/dist/runtime/execution/state-lane.js +5 -0
- package/dist/runtime/foundation/operation-registry.d.ts +25 -1
- package/dist/runtime/foundation/operation-registry.js +86 -18
- package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +39 -3
- package/dist/runtime/foundation/raw-service-mesh-runtime.js +151 -55
- package/dist/runtime/foundation/service-liveness-registry.d.ts +12 -1
- package/dist/runtime/foundation/service-liveness-registry.js +38 -0
- package/dist/runtime/foundation/service-mailbox.d.ts +7 -0
- package/dist/runtime/foundation/service-maintenance-runtime.js +1 -6
- package/dist/runtime/foundation/service-relocation-object-owner.d.ts +2 -3
- package/dist/runtime/foundation/service-relocation-object-owner.js +48 -35
- package/dist/runtime/foundation/service-relocation-runtime.js +7 -3
- package/dist/runtime/foundation/service-runtime-contracts.d.ts +8 -1
- package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +2 -1
- package/dist/runtime/foundation/service-stateful-registry.d.ts +5 -4
- package/dist/runtime/foundation/service-stateful-registry.js +24 -26
- package/dist/runtime/foundation/service-stateful-runtime.d.ts +72 -6
- package/dist/runtime/foundation/service-stateful-runtime.js +444 -117
- package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +14 -1
- package/dist/runtime/foundation/service-stateful-wire-codec.js +48 -27
- package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +6 -1
- package/dist/runtime/foundation/service-wire-binary-primitives.js +27 -11
- package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
- package/dist/runtime/foundation/service-wire-constants.generated.js +1 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +10 -0
- package/dist/runtime/foundation/service-wire-m6a-codec.js +166 -53
- package/dist/runtime/host/actor-packet-relay.d.ts +6 -4
- package/dist/runtime/host/actor-packet-relay.js +59 -72
- package/dist/runtime/host/actor-placement-coordinator.js +25 -8
- package/dist/runtime/host/actor-transfer-runtime.d.ts +7 -31
- package/dist/runtime/host/actor-transfer-runtime.js +85 -331
- package/dist/runtime/host/application-job-queue.d.ts +24 -3
- package/dist/runtime/host/application-job-queue.js +28 -41
- package/dist/runtime/host/index.d.ts +5 -1
- package/dist/runtime/host/index.js +171 -97
- package/dist/runtime/host/location-runtime-owner.js +2 -6
- package/dist/runtime/host/mesh-router-resolver.d.ts +4 -0
- package/dist/runtime/host/mesh-router-resolver.js +14 -6
- package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -4
- package/dist/runtime/host/remote-bound-session-relay.js +71 -190
- package/dist/runtime/host/route-mesh-runtime.d.ts +2 -2
- package/dist/runtime/host/route-mesh-runtime.js +5 -3
- package/dist/runtime/host/runtime-shutdown.d.ts +1 -0
- package/dist/runtime/host/runtime-shutdown.js +3 -2
- package/dist/runtime/host/service-relocation-host-runtime.d.ts +17 -7
- package/dist/runtime/host/service-relocation-host-runtime.js +550 -367
- package/dist/runtime/host/spot-runtime-options-factory.js +15 -7
- package/dist/runtime/host/user-spot-creation-coordinator.js +33 -84
- package/dist/runtime/locations/auto-connect-loop.d.ts +2 -0
- package/dist/runtime/locations/auto-connect-loop.js +22 -14
- package/dist/runtime/locations/auto-connect-reconciler.js +0 -6
- package/dist/runtime/locations/auto-connect-types.d.ts +0 -1
- package/dist/runtime/locations/descriptor-publication.d.ts +4 -0
- package/dist/runtime/locations/descriptor-publication.js +11 -0
- package/dist/runtime/locations/domain-store-contract.d.ts +1 -0
- package/dist/runtime/locations/in-memory-authority-store.d.ts +7 -1
- package/dist/runtime/locations/in-memory-authority-store.js +56 -19
- package/dist/runtime/locations/in-memory-location-store.js +1 -10
- package/dist/runtime/locations/index.d.ts +1 -0
- package/dist/runtime/locations/index.js +1 -0
- package/dist/runtime/locations/lease-tracker.js +1 -6
- package/dist/runtime/locations/location-store-repository.d.ts +51 -1
- package/dist/runtime/locations/location-store-repository.js +363 -139
- package/dist/runtime/locations/relocation-blob.d.ts +18 -1
- package/dist/runtime/locations/relocation-blob.js +52 -1
- package/dist/runtime/locations/request-source-resolver.d.ts +37 -0
- package/dist/runtime/locations/request-source-resolver.js +80 -0
- package/dist/runtime/locations/resolvers.js +1 -1
- package/dist/runtime/locations/runtime.d.ts +6 -2
- package/dist/runtime/locations/runtime.js +37 -30
- package/dist/runtime/messaging/payload-codec.d.ts +7 -1
- package/dist/runtime/messaging/payload-codec.js +7 -6
- package/dist/runtime/messaging/request-result.js +29 -26
- package/dist/runtime/protocol/service_wire_codec.generated.d.ts +19 -1
- package/dist/runtime/protocol/service_wire_codec.generated.js +85 -0
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +7 -1
- package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +23 -7
- package/dist/runtime/spots/formal-remote-actor-admission-registry.js +3 -2
- package/dist/runtime/spots/index.d.ts +18 -11
- package/dist/runtime/spots/index.js +234 -176
- package/dist/runtime/spots/spot-activation-registry.d.ts +4 -2
- package/dist/runtime/spots/spot-activation-registry.js +21 -11
- package/dist/runtime/spots/spot-activation-state.d.ts +1 -1
- package/dist/runtime/spots/spot-activation-state.js +7 -7
- package/dist/runtime/spots/spot-activation.d.ts +6 -3
- package/dist/runtime/spots/spot-activation.js +123 -44
- package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -0
- package/dist/runtime/spots/spot-actor-admission-coordinator.js +13 -22
- package/dist/runtime/spots/spot-actor-membership.d.ts +0 -1
- package/dist/runtime/spots/spot-actor-membership.js +0 -8
- package/dist/runtime/spots/spot-actor-packet-dispatch.js +33 -8
- package/dist/runtime/spots/spot-actor-packet-drain.js +5 -33
- package/dist/runtime/spots/spot-entry-activation.d.ts +2 -0
- package/dist/runtime/spots/spot-entry-activation.js +14 -9
- package/dist/runtime/spots/spot-handler-registry.d.ts +4 -3
- package/dist/runtime/spots/spot-handler-registry.js +6 -2
- package/dist/runtime/spots/spot-manager-internal-contracts.d.ts +2 -2
- package/dist/runtime/spots/spot-manager-public.js +2 -2
- package/dist/runtime/spots/spot-node-autoconnect.d.ts +2 -1
- package/dist/runtime/spots/spot-node-autoconnect.js +18 -39
- package/dist/runtime/spots/spot-node-runtime-manager.d.ts +19 -2
- package/dist/runtime/spots/spot-node-runtime-manager.js +115 -50
- package/dist/runtime/spots/spot-outbound.js +3 -3
- package/dist/runtime/spots/spot-remote-codec.js +5 -1
- package/dist/runtime/spots/spot-runtime-ports.d.ts +0 -1
- package/dist/runtime/spots/spot-serial-executor.d.ts +10 -0
- package/dist/runtime/spots/spot-serial-executor.js +61 -8
- package/dist/runtime/spots/spot-serial-turn-executor.js +19 -2
- package/dist/runtime/spots/spot-subscription-dispatch.js +1 -1
- package/dist/runtime/spots/spot-timer.d.ts +57 -5
- package/dist/runtime/spots/spot-timer.js +287 -103
- package/dist/runtime/streams/actor-session-binding-registry.d.ts +42 -11
- package/dist/runtime/streams/actor-session-binding-registry.js +165 -48
- package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +8 -4
- package/dist/runtime/streams/bound-actor-relay-sender.d.ts +2 -1
- package/dist/runtime/streams/bound-actor-relay-sender.js +15 -8
- package/dist/runtime/streams/bound-session-service.d.ts +1 -1
- package/dist/runtime/streams/bound-session-service.js +6 -11
- package/dist/runtime/streams/index.d.ts +3 -2
- package/dist/runtime/streams/index.js +6 -4
- package/dist/runtime/streams/managed-stream.js +3 -2
- package/dist/runtime/streams/native-fallback-bound-session.js +8 -73
- package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -8
- package/dist/runtime/streams/session-actor-coordinator.js +15 -32
- package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +3 -10
- package/dist/runtime/streams/stream-session-runtime.js +1 -4
- package/dist/runtime/workers/index.js +1 -1
- package/package.json +3 -3
- package/src/contracts/Common/ZLinkEncodedPayload.ts +24 -4
- package/src/contracts/Common/encoded-payload-storage.ts +6 -3
- package/src/contracts/Configuration/Builders.ts +4 -1
- package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +7 -2
- package/src/contracts/Configuration/RegistrationBuilders.ts +6 -2
- package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
- package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +2 -1
- package/src/contracts/Locations/Rows.ts +2 -0
- package/src/contracts/Spots/Contracts.ts +8 -0
- package/src/contracts/Spots/ZLinkSpot.ts +3 -3
- package/src/runtime/abort.ts +12 -0
- package/src/runtime/actors/actor-authority-publication.ts +3 -2
- package/src/runtime/actors/actor-client.ts +61 -70
- package/src/runtime/actors/actor-context.ts +49 -9
- package/src/runtime/actors/actor-handoff.ts +282 -106
- package/src/runtime/actors/actor-join-relocation.ts +2 -0
- package/src/runtime/actors/actor-local-native-join.ts +4 -0
- package/src/runtime/actors/actor-mailbox.ts +40 -2
- package/src/runtime/actors/actor-remote-joiner.ts +6 -1
- package/src/runtime/actors/actor-reply.ts +42 -0
- package/src/runtime/actors/actor-runtime-contracts.ts +2 -0
- package/src/runtime/actors/actor-runtime-state.ts +2 -20
- package/src/runtime/actors/actor-source-transfer.ts +1 -34
- package/src/runtime/actors/index.ts +41 -27
- package/src/runtime/actors/session-disconnected-wire.ts +66 -0
- package/src/runtime/admission.ts +69 -34
- package/src/runtime/application-jobs/application-job-queue-scope.ts +33 -1
- package/src/runtime/application-jobs/contracts.ts +2 -0
- package/src/runtime/backend/contracts/index.ts +39 -4
- package/src/runtime/backend/mesh-actor-session-node-adapter.ts +5 -3
- package/src/runtime/backend/mesh-completion-table.ts +4 -0
- package/src/runtime/backend/mesh-dispatch-pump.ts +223 -124
- package/src/runtime/backend/node/node-raw-binding-port.ts +106 -70
- package/src/runtime/backend/node/node-raw-mesh-backend.ts +221 -170
- package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -5
- package/src/runtime/channels/channel-clients.ts +49 -24
- package/src/runtime/channels/channel-dispatch-pipeline.ts +173 -124
- package/src/runtime/channels/channel-dispatchers.ts +116 -72
- package/src/runtime/channels/channel-envelope.ts +105 -36
- package/src/runtime/channels/channel-runtime-lifecycle.ts +13 -13
- package/src/runtime/channels/channel-runtime-manager.ts +12 -5
- package/src/runtime/channels/channel-transports.ts +49 -58
- package/src/runtime/channels/client-server-location-runtime.ts +11 -10
- package/src/runtime/channels/dispatch-error-reporter.ts +4 -2
- package/src/runtime/channels/fanout-location-runtime.ts +17 -9
- package/src/runtime/diagnostics/flow-context.ts +20 -7
- package/src/runtime/diagnostics/index.ts +1 -7
- package/src/runtime/diagnostics/message-flow.ts +47 -9
- package/src/runtime/diagnostics/runtime-metrics.ts +12 -10
- package/src/runtime/execution/index.ts +40 -14
- package/src/runtime/execution/serial-execution-queue.ts +31 -4
- package/src/runtime/execution/state-lane.ts +7 -0
- package/src/runtime/foundation/operation-registry.ts +98 -20
- package/src/runtime/foundation/raw-service-mesh-runtime.ts +244 -67
- package/src/runtime/foundation/service-liveness-registry.ts +39 -0
- package/src/runtime/foundation/service-mailbox.ts +8 -0
- package/src/runtime/foundation/service-maintenance-runtime.ts +1 -8
- package/src/runtime/foundation/service-relocation-object-owner.ts +54 -37
- package/src/runtime/foundation/service-relocation-runtime.ts +7 -3
- package/src/runtime/foundation/service-runtime-contracts.ts +12 -1
- package/src/runtime/foundation/service-session-binding-ingress-port.ts +2 -1
- package/src/runtime/foundation/service-stateful-registry.ts +38 -35
- package/src/runtime/foundation/service-stateful-runtime.ts +667 -152
- package/src/runtime/foundation/service-stateful-wire-codec.ts +49 -11
- package/src/runtime/foundation/service-wire-binary-primitives.ts +35 -12
- package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
- package/src/runtime/foundation/service-wire-m6a-codec.ts +187 -51
- package/src/runtime/host/actor-packet-relay.ts +113 -94
- package/src/runtime/host/actor-placement-coordinator.ts +31 -8
- package/src/runtime/host/actor-transfer-runtime.ts +104 -430
- package/src/runtime/host/application-job-queue.ts +29 -44
- package/src/runtime/host/index.ts +286 -129
- package/src/runtime/host/location-runtime-owner.ts +2 -6
- package/src/runtime/host/mesh-router-resolver.ts +13 -5
- package/src/runtime/host/remote-bound-session-relay.ts +86 -248
- package/src/runtime/host/route-mesh-runtime.ts +11 -5
- package/src/runtime/host/runtime-shutdown.ts +15 -4
- package/src/runtime/host/service-relocation-host-runtime.ts +784 -475
- package/src/runtime/host/spot-runtime-options-factory.ts +18 -7
- package/src/runtime/host/user-spot-creation-coordinator.ts +41 -100
- package/src/runtime/locations/auto-connect-loop.ts +22 -14
- package/src/runtime/locations/auto-connect-reconciler.ts +0 -6
- package/src/runtime/locations/auto-connect-types.ts +0 -1
- package/src/runtime/locations/descriptor-publication.ts +7 -0
- package/src/runtime/locations/domain-store-contract.ts +5 -0
- package/src/runtime/locations/in-memory-authority-store.ts +85 -23
- package/src/runtime/locations/in-memory-location-store.ts +1 -12
- package/src/runtime/locations/index.ts +1 -0
- package/src/runtime/locations/lease-tracker.ts +2 -9
- package/src/runtime/locations/location-store-repository.ts +628 -152
- package/src/runtime/locations/relocation-blob.ts +75 -1
- package/src/runtime/locations/request-source-resolver.ts +138 -0
- package/src/runtime/locations/resolvers.ts +2 -2
- package/src/runtime/locations/runtime.ts +70 -40
- package/src/runtime/messaging/payload-codec.ts +8 -11
- package/src/runtime/messaging/request-result.ts +33 -29
- package/src/runtime/protocol/service_wire_codec.generated.ts +87 -4
- package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +13 -10
- package/src/runtime/spots/formal-remote-actor-admission-registry.ts +3 -2
- package/src/runtime/spots/index.ts +375 -281
- package/src/runtime/spots/spot-activation-registry.ts +25 -13
- package/src/runtime/spots/spot-activation-state.ts +12 -19
- package/src/runtime/spots/spot-activation.ts +170 -86
- package/src/runtime/spots/spot-actor-admission-coordinator.ts +25 -55
- package/src/runtime/spots/spot-actor-membership.ts +0 -15
- package/src/runtime/spots/spot-actor-packet-dispatch.ts +56 -11
- package/src/runtime/spots/spot-actor-packet-drain.ts +9 -52
- package/src/runtime/spots/spot-entry-activation.ts +24 -19
- package/src/runtime/spots/spot-handler-registry.ts +15 -4
- package/src/runtime/spots/spot-manager-internal-contracts.ts +2 -2
- package/src/runtime/spots/spot-manager-public.ts +2 -2
- package/src/runtime/spots/spot-node-autoconnect.ts +22 -45
- package/src/runtime/spots/spot-node-runtime-manager.ts +197 -67
- package/src/runtime/spots/spot-outbound.ts +3 -3
- package/src/runtime/spots/spot-remote-codec.ts +9 -2
- package/src/runtime/spots/spot-runtime-ports.ts +0 -1
- package/src/runtime/spots/spot-serial-executor.ts +97 -25
- package/src/runtime/spots/spot-serial-turn-executor.ts +22 -3
- package/src/runtime/spots/spot-subscription-dispatch.ts +1 -1
- package/src/runtime/spots/spot-timer.ts +413 -157
- package/src/runtime/streams/actor-session-binding-registry.ts +236 -64
- package/src/runtime/streams/actor-session-binding-runtime-owner.ts +16 -8
- package/src/runtime/streams/bound-actor-relay-sender.ts +23 -9
- package/src/runtime/streams/bound-session-service.ts +7 -10
- package/src/runtime/streams/index.ts +12 -6
- package/src/runtime/streams/managed-stream.ts +4 -2
- package/src/runtime/streams/native-fallback-bound-session.ts +14 -103
- package/src/runtime/streams/session-actor-coordinator.ts +39 -88
- package/src/runtime/streams/stream-binding-runtime-ports.ts +3 -9
- package/src/runtime/streams/stream-session-runtime.ts +1 -5
- package/src/runtime/workers/index.ts +1 -1
|
@@ -6,6 +6,7 @@ exports.encodeChannelEnvelopeParts = encodeChannelEnvelopeParts;
|
|
|
6
6
|
exports.encodeChannelEnvelopePartsAtDeadline = encodeChannelEnvelopePartsAtDeadline;
|
|
7
7
|
exports.encodeChannelPublishEnvelopeParts = encodeChannelPublishEnvelopeParts;
|
|
8
8
|
exports.encodeChannelReplyParts = encodeChannelReplyParts;
|
|
9
|
+
exports.channelErrorKindFromCode = channelErrorKindFromCode;
|
|
9
10
|
exports.channelErrorCodeName = channelErrorCodeName;
|
|
10
11
|
exports.encodeChannelErrorReplyParts = encodeChannelErrorReplyParts;
|
|
11
12
|
exports.decodeChannelReply = decodeChannelReply;
|
|
@@ -43,8 +44,20 @@ const CHANNEL_CORRELATION_TEXT_LENGTH = 32;
|
|
|
43
44
|
const PREPARED_CHANNEL_CORRELATION = '0'.repeat(CHANNEL_CORRELATION_TEXT_LENGTH);
|
|
44
45
|
const PREPARED_CHANNEL_DEADLINE = '2000-01-01T00:00:00.000Z';
|
|
45
46
|
const CHANNEL_CORRELATION_TEXT = /^[0-9a-f]{32}$/;
|
|
47
|
+
const CHANNEL_FLOW_FIELD = ',"flowId":';
|
|
48
|
+
// A flow id is a lowercase UUIDv7 (spec 27 §3): fixed 36 JSON-safe ASCII bytes.
|
|
49
|
+
const PREPARED_CHANNEL_FLOW = '00000000-0000-7000-8000-000000000000';
|
|
50
|
+
const CHANNEL_FLOW_TEXT = /^[0-9a-f-]{36}$/;
|
|
51
|
+
// A per-process random 64-bit prefix followed by a per-process counter, both
|
|
52
|
+
// as lowercase hex: unique among the runtime's pending requests (spec 06-obs/04
|
|
53
|
+
// §3) without drawing random bytes for every request — the shape Java
|
|
54
|
+
// ZLinkServiceOperationIds uses.
|
|
55
|
+
const CHANNEL_CORRELATION_PREFIX = (0, node_crypto_1.randomBytes)(CHANNEL_CORRELATION_TEXT_LENGTH / 4).toString('hex');
|
|
56
|
+
let channelCorrelationCounter = 0;
|
|
46
57
|
function newChannelCorrelationId() {
|
|
47
|
-
|
|
58
|
+
channelCorrelationCounter += 1;
|
|
59
|
+
return (CHANNEL_CORRELATION_PREFIX +
|
|
60
|
+
channelCorrelationCounter.toString(16).padStart(CHANNEL_CORRELATION_TEXT_LENGTH / 2, '0'));
|
|
48
61
|
}
|
|
49
62
|
function encodeChannelEnvelopeParts(kind, channelName, packetName, payload, timeoutMs, topic, codecs, correlationId, createFlow = true, metadata = EMPTY_OUTBOUND_METADATA) {
|
|
50
63
|
return encodeChannelEnvelopePartsAtDeadline(kind, channelName, packetName, payload, timeoutMs === undefined ? undefined : Date.now() + timeoutMs, topic, codecs, correlationId, createFlow, metadata);
|
|
@@ -114,6 +127,9 @@ const ERROR_KIND_WIRE_NAMES = [
|
|
|
114
127
|
'internal_failure' // 11
|
|
115
128
|
];
|
|
116
129
|
const ERROR_KIND_BY_WIRE_NAME = new Map(ERROR_KIND_WIRE_NAMES.map((name, kind) => [name, kind]));
|
|
130
|
+
function channelErrorKindFromCode(code) {
|
|
131
|
+
return ERROR_KIND_BY_WIRE_NAME.get(code);
|
|
132
|
+
}
|
|
117
133
|
function channelErrorCodeName(kind) {
|
|
118
134
|
return ERROR_KIND_WIRE_NAMES[kind] ?? 'internal_failure';
|
|
119
135
|
}
|
|
@@ -149,7 +165,7 @@ function decodeChannelReply(parts, codecs) {
|
|
|
149
165
|
return runtime_message_1.ZLinkBufferMessage.retainPayload(parts[1]);
|
|
150
166
|
}
|
|
151
167
|
if (serializer !== undefined) {
|
|
152
|
-
return serializer.deserialize(
|
|
168
|
+
return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(parts[1].data()), Object);
|
|
153
169
|
}
|
|
154
170
|
return parseWireJson(parts[1].data().toString(), (0, Attributes_1.readZLinkPacketJsonContract)(header.messageName)?.reply);
|
|
155
171
|
}
|
|
@@ -164,7 +180,7 @@ function decodeChannelError(header) {
|
|
|
164
180
|
// Cross-language contract: errorCode carries the snake_case wire name.
|
|
165
181
|
// An unknown name degrades to InternalFailure, matching the C++
|
|
166
182
|
// request_failure_mapper fallback for unrecognized codes.
|
|
167
|
-
const publicKind =
|
|
183
|
+
const publicKind = channelErrorKindFromCode(code) ?? contracts_1.ZLinkFrameworkErrorKind.InternalFailure;
|
|
168
184
|
failure = new contracts_1.ZLinkFrameworkException(publicKind, message);
|
|
169
185
|
}
|
|
170
186
|
// Cross-language contract (.NET ZLinkErrorOriginWire.RemoteReplyOrigin /
|
|
@@ -206,7 +222,7 @@ function decodeChannelPayload(envelope, codecs) {
|
|
|
206
222
|
}
|
|
207
223
|
const serializer = codecs?.serializers.get(envelope.header.contentType);
|
|
208
224
|
if (serializer !== undefined) {
|
|
209
|
-
return serializer.deserialize(
|
|
225
|
+
return serializer.deserialize((0, payload_codec_1.encodedPayloadFromOwned)(envelope.payload), Object);
|
|
210
226
|
}
|
|
211
227
|
if (envelope.header.contentType === exports.BINARY_CONTENT_TYPE) {
|
|
212
228
|
// The receive loop owns the Message for the duration of dispatch, so
|
|
@@ -282,8 +298,9 @@ function encodeJsonBytes(value, schema) {
|
|
|
282
298
|
function encodeChannelHeader(kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin, codecs) {
|
|
283
299
|
if (codecs !== undefined &&
|
|
284
300
|
metadata === EMPTY_APPLICATION_METADATA &&
|
|
285
|
-
flowId === undefined
|
|
286
|
-
|
|
301
|
+
(flowId === undefined
|
|
302
|
+
? flowOrigin === undefined
|
|
303
|
+
: flowOrigin !== undefined && CHANNEL_FLOW_TEXT.test(flowId)) &&
|
|
287
304
|
topic === null &&
|
|
288
305
|
source === undefined &&
|
|
289
306
|
((kind === 3 /* ZLinkChannelMessageKind.Command */ &&
|
|
@@ -304,7 +321,7 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
|
|
|
304
321
|
deadline === null &&
|
|
305
322
|
errorCode === undefined &&
|
|
306
323
|
errorMessage === undefined))) {
|
|
307
|
-
return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage);
|
|
324
|
+
return preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin);
|
|
308
325
|
}
|
|
309
326
|
// The wire has a fixed field order. Measure escaped UTF-8 first, then write
|
|
310
327
|
// each field once into the only header Buffer: no header object, whole JSON
|
|
@@ -316,7 +333,7 @@ function encodeChannelHeader(kind, channelName, messageName, contentType, correl
|
|
|
316
333
|
writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin);
|
|
317
334
|
return result;
|
|
318
335
|
}
|
|
319
|
-
function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage) {
|
|
336
|
+
function preparedChannelHeader(codecs, kind, channelName, messageName, contentType, correlationId, deadline, errorCode, errorMessage, flowId, flowOrigin) {
|
|
320
337
|
let channels = preparedChannelHeaders.get(codecs.serializers);
|
|
321
338
|
if (channels === undefined)
|
|
322
339
|
preparedChannelHeaders.set(codecs.serializers, (channels = new Map()));
|
|
@@ -333,23 +350,30 @@ function preparedChannelHeader(codecs, kind, channelName, messageName, contentTy
|
|
|
333
350
|
if (deadlines === undefined)
|
|
334
351
|
kinds.set(kind, (deadlines = new Map()));
|
|
335
352
|
const hasDeadline = deadline !== null;
|
|
336
|
-
let
|
|
353
|
+
let flows = deadlines.get(hasDeadline);
|
|
354
|
+
if (flows === undefined)
|
|
355
|
+
deadlines.set(hasDeadline, (flows = new Map()));
|
|
356
|
+
let prepared = flows.get(flowOrigin);
|
|
337
357
|
if (prepared === undefined) {
|
|
338
|
-
const bytes = encodeChannelHeader(kind, channelName, messageName, contentType, correlationId === null ? null : PREPARED_CHANNEL_CORRELATION, hasDeadline ? PREPARED_CHANNEL_DEADLINE : null, null, errorCode, errorMessage, undefined, EMPTY_APPLICATION_METADATA, undefined,
|
|
358
|
+
const bytes = encodeChannelHeader(kind, channelName, messageName, contentType, correlationId === null ? null : PREPARED_CHANNEL_CORRELATION, hasDeadline ? PREPARED_CHANNEL_DEADLINE : null, null, errorCode, errorMessage, undefined, EMPTY_APPLICATION_METADATA, flowOrigin === undefined ? undefined : PREPARED_CHANNEL_FLOW, flowOrigin);
|
|
339
359
|
prepared = {
|
|
340
360
|
bytes,
|
|
341
361
|
correlationOffset: bytes.indexOf(CHANNEL_CORRELATION_FIELD) + CHANNEL_CORRELATION_FIELD.length + 1,
|
|
342
|
-
deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1
|
|
362
|
+
deadlineOffset: bytes.indexOf(CHANNEL_DEADLINE_FIELD) + CHANNEL_DEADLINE_FIELD.length + 1,
|
|
363
|
+
flowOffset: bytes.indexOf(CHANNEL_FLOW_FIELD) + CHANNEL_FLOW_FIELD.length + 1
|
|
343
364
|
};
|
|
344
|
-
|
|
365
|
+
flows.set(flowOrigin, prepared);
|
|
345
366
|
}
|
|
346
|
-
if (correlationId === null)
|
|
367
|
+
if (correlationId === null && flowId === undefined)
|
|
347
368
|
return prepared.bytes;
|
|
348
|
-
const bytes = Buffer.
|
|
369
|
+
const bytes = Buffer.allocUnsafe(prepared.bytes.byteLength);
|
|
349
370
|
prepared.bytes.copy(bytes);
|
|
350
|
-
|
|
371
|
+
if (correlationId !== null)
|
|
372
|
+
bytes.write(correlationId, prepared.correlationOffset, CHANNEL_CORRELATION_TEXT_LENGTH, 'ascii');
|
|
351
373
|
if (deadline !== null)
|
|
352
374
|
bytes.write(deadline, prepared.deadlineOffset, PREPARED_CHANNEL_DEADLINE.length, 'ascii');
|
|
375
|
+
if (flowId !== undefined)
|
|
376
|
+
bytes.write(flowId, prepared.flowOffset, PREPARED_CHANNEL_FLOW.length, 'ascii');
|
|
353
377
|
return bytes;
|
|
354
378
|
}
|
|
355
379
|
function writeChannelHeader(writer, kind, channelName, messageName, contentType, correlationId, deadline, topic, errorCode, errorMessage, source, metadata, flowId, flowOrigin) {
|
|
@@ -509,10 +533,16 @@ function parseWireJson(payload, schema) {
|
|
|
509
533
|
}, schema);
|
|
510
534
|
}
|
|
511
535
|
function parseChannelHeaderBytes(payload) {
|
|
536
|
+
const reader = new CanonicalChannelHeaderReader(payload);
|
|
537
|
+
const canonical = tryParseCanonicalChannelHeader(reader);
|
|
538
|
+
// An all-ASCII canonical header is valid UTF-8 by construction; any other
|
|
539
|
+
// header is checked before it is decoded.
|
|
540
|
+
if (canonical !== undefined && !reader.sawNonAscii)
|
|
541
|
+
return canonical;
|
|
512
542
|
if (!(0, node_buffer_1.isUtf8)(payload)) {
|
|
513
543
|
throw new contracts_1.ZLinkFrameworkException(contracts_1.ZLinkFrameworkErrorKind.ProtocolError, 'Channel envelope header must contain valid UTF-8.');
|
|
514
544
|
}
|
|
515
|
-
return
|
|
545
|
+
return canonical ?? (0, framework_json_v1_1.parseFrameworkJsonV1)(payload.toString());
|
|
516
546
|
}
|
|
517
547
|
/**
|
|
518
548
|
* Accept the byte layout emitted by writeChannelHeader without materializing
|
|
@@ -520,8 +550,7 @@ function parseChannelHeaderBytes(payload) {
|
|
|
520
550
|
* framework-json-v1 parser, which remains the sole authority for JSON
|
|
521
551
|
* failures and unknown properties. Header metadata accepts every valid string key.
|
|
522
552
|
*/
|
|
523
|
-
function tryParseCanonicalChannelHeader(
|
|
524
|
-
const reader = new CanonicalChannelHeaderReader(payload);
|
|
553
|
+
function tryParseCanonicalChannelHeader(reader) {
|
|
525
554
|
if (!reader.consume('{"formatMarker":242,"kind":'))
|
|
526
555
|
return undefined;
|
|
527
556
|
const kind = reader.readSingleDigit();
|
|
@@ -555,25 +584,32 @@ function tryParseCanonicalChannelHeader(payload) {
|
|
|
555
584
|
deadline: deadline === NULL_JSON_STRING ? null : deadline,
|
|
556
585
|
topic: topic === NULL_JSON_STRING ? null : topic
|
|
557
586
|
};
|
|
558
|
-
if (!reader.readOptionalNullableString('errorCode', header))
|
|
587
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_CODE, 'errorCode', header))
|
|
559
588
|
return undefined;
|
|
560
|
-
if (!reader.readOptionalNullableString('errorMessage', header))
|
|
589
|
+
if (!reader.readOptionalNullableString(CANONICAL_ERROR_MESSAGE, 'errorMessage', header))
|
|
561
590
|
return undefined;
|
|
562
|
-
if (!reader.readOptionalNullableString('source', header))
|
|
591
|
+
if (!reader.readOptionalNullableString(CANONICAL_SOURCE, 'source', header))
|
|
563
592
|
return undefined;
|
|
593
|
+
// Empty metadata validates to the shared empty record.
|
|
564
594
|
if (!reader.consume(',"metadata":{}'))
|
|
565
595
|
return undefined;
|
|
566
|
-
|
|
567
|
-
if (!reader.readOptionalString('flowId', header))
|
|
596
|
+
if (!reader.readOptionalString(CANONICAL_FLOW_ID, 'flowId', header))
|
|
568
597
|
return undefined;
|
|
569
|
-
if (!reader.readOptionalSingleDigit('flowOrigin', header))
|
|
598
|
+
if (!reader.readOptionalSingleDigit(CANONICAL_FLOW_ORIGIN, 'flowOrigin', header))
|
|
570
599
|
return undefined;
|
|
571
600
|
return reader.consume('}') && reader.atEnd() ? header : undefined;
|
|
572
601
|
}
|
|
602
|
+
const CANONICAL_ERROR_CODE = ',"errorCode":';
|
|
603
|
+
const CANONICAL_ERROR_MESSAGE = ',"errorMessage":';
|
|
604
|
+
const CANONICAL_SOURCE = ',"source":';
|
|
605
|
+
const CANONICAL_FLOW_ID = ',"flowId":';
|
|
606
|
+
const CANONICAL_FLOW_ORIGIN = ',"flowOrigin":';
|
|
573
607
|
const NULL_JSON_STRING = Symbol('null JSON string');
|
|
574
608
|
class CanonicalChannelHeaderReader {
|
|
575
609
|
bytes;
|
|
576
610
|
index = 0;
|
|
611
|
+
/** A string held a byte outside ASCII, so the caller must still check UTF-8. */
|
|
612
|
+
sawNonAscii = false;
|
|
577
613
|
constructor(bytes) {
|
|
578
614
|
this.bytes = bytes;
|
|
579
615
|
}
|
|
@@ -604,15 +640,22 @@ class CanonicalChannelHeaderReader {
|
|
|
604
640
|
return undefined;
|
|
605
641
|
const start = this.index;
|
|
606
642
|
this.index += 1;
|
|
643
|
+
let hasEscape = false;
|
|
607
644
|
while (this.index < this.bytes.length) {
|
|
608
645
|
const value = this.bytes[this.index++];
|
|
609
646
|
if (value === 0x22) {
|
|
610
|
-
|
|
647
|
+
// Without escapes the JSON string is its own bytes; decode them once.
|
|
648
|
+
return hasEscape
|
|
649
|
+
? JSON.parse(this.bytes.toString('utf8', start, this.index))
|
|
650
|
+
: this.bytes.toString(this.sawNonAscii ? 'utf8' : 'latin1', start + 1, this.index - 1);
|
|
611
651
|
}
|
|
612
652
|
if (value < 0x20)
|
|
613
653
|
return undefined;
|
|
654
|
+
if (value >= 0x80)
|
|
655
|
+
this.sawNonAscii = true;
|
|
614
656
|
if (value !== 0x5c)
|
|
615
657
|
continue;
|
|
658
|
+
hasEscape = true;
|
|
616
659
|
if (this.index === this.bytes.length)
|
|
617
660
|
return undefined;
|
|
618
661
|
const escaped = this.bytes[this.index++];
|
|
@@ -643,8 +686,8 @@ class CanonicalChannelHeaderReader {
|
|
|
643
686
|
return NULL_JSON_STRING;
|
|
644
687
|
return this.readString();
|
|
645
688
|
}
|
|
646
|
-
readOptionalNullableString(name, target) {
|
|
647
|
-
if (!this.consume(
|
|
689
|
+
readOptionalNullableString(token, name, target) {
|
|
690
|
+
if (!this.consume(token))
|
|
648
691
|
return true;
|
|
649
692
|
const value = this.readNullableString();
|
|
650
693
|
if (value === undefined)
|
|
@@ -652,8 +695,8 @@ class CanonicalChannelHeaderReader {
|
|
|
652
695
|
target[name] = value === NULL_JSON_STRING ? null : value;
|
|
653
696
|
return true;
|
|
654
697
|
}
|
|
655
|
-
readOptionalString(name, target) {
|
|
656
|
-
if (!this.consume(
|
|
698
|
+
readOptionalString(token, name, target) {
|
|
699
|
+
if (!this.consume(token))
|
|
657
700
|
return true;
|
|
658
701
|
const value = this.readString();
|
|
659
702
|
if (value === undefined)
|
|
@@ -661,8 +704,8 @@ class CanonicalChannelHeaderReader {
|
|
|
661
704
|
target[name] = value;
|
|
662
705
|
return true;
|
|
663
706
|
}
|
|
664
|
-
readOptionalSingleDigit(name, target) {
|
|
665
|
-
if (!this.consume(
|
|
707
|
+
readOptionalSingleDigit(token, name, target) {
|
|
708
|
+
if (!this.consume(token))
|
|
666
709
|
return true;
|
|
667
710
|
const value = this.readSingleDigit();
|
|
668
711
|
if (value === undefined)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
2
3
|
import type { ZLinkFrameworkRegistration } from '../configuration';
|
|
3
4
|
import type { ZLinkBackendSpotRouteBridge, ZLinkChannelBackendAdapter } from '../backend/contracts';
|
|
@@ -49,7 +50,7 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
49
50
|
lifecycleGeneration: bigint;
|
|
50
51
|
descriptorRevision: bigint;
|
|
51
52
|
advertisedEndpoint: string;
|
|
52
|
-
state: "error" | "preparing" | "serving" | "
|
|
53
|
+
state: "error" | "preparing" | "serving" | "stopped" | "retiring";
|
|
53
54
|
}[] | undefined;
|
|
54
55
|
configureLocationAutoConnect(runtime: ZLinkLocationRuntime, stores: ZLinkLocationRuntimeStores, options: ZLinkLocationOptionOverrides, events?: ZLinkLocationEventSink): void;
|
|
55
56
|
private beginLocationAutoConnectCore;
|
|
@@ -60,8 +61,8 @@ export declare class ZLinkChannelRuntimeLifecycle {
|
|
|
60
61
|
bindRouteMeshRouters(): void;
|
|
61
62
|
start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
|
|
62
63
|
prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
|
|
63
|
-
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
64
|
-
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
64
|
+
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
65
|
+
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
65
66
|
dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
|
|
66
67
|
canDispatchLocalMeshRoute(meshName: string): boolean;
|
|
67
68
|
dispose(signal?: AbortSignal): Promise<void>;
|
|
@@ -10,9 +10,7 @@ const channel_receive_loops_1 = require("./channel-receive-loops");
|
|
|
10
10
|
const client_server_location_runtime_1 = require("./client-server-location-runtime");
|
|
11
11
|
const fanout_location_runtime_1 = require("./fanout-location-runtime");
|
|
12
12
|
const RuntimeEndpointConnections_1 = require("../../contracts/Configuration/RuntimeEndpointConnections");
|
|
13
|
-
const node_async_hooks_1 = require("node:async_hooks");
|
|
14
13
|
const state_lane_1 = require("../execution/state-lane");
|
|
15
|
-
const detachedStateLaneResource = new node_async_hooks_1.AsyncResource('zlink:channel-runtime-lifecycle');
|
|
16
14
|
class ZLinkChannelRuntimeLifecycle {
|
|
17
15
|
options;
|
|
18
16
|
lane = new state_lane_1.ZLinkStateLane();
|
|
@@ -74,12 +72,12 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
74
72
|
return;
|
|
75
73
|
let fanoutLocation;
|
|
76
74
|
try {
|
|
77
|
-
await startOutsideStateLane(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
|
|
75
|
+
await (0, state_lane_1.startOutsideStateLane)(() => start.clientServerLocation?.start(signal) ?? Promise.resolve());
|
|
78
76
|
fanoutLocation = await this.lane.run(() => this.beginFanoutLocationAutoConnectCore(start));
|
|
79
|
-
await startOutsideStateLane(() => fanoutLocation?.start(signal) ?? Promise.resolve());
|
|
77
|
+
await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.start(signal) ?? Promise.resolve());
|
|
80
78
|
}
|
|
81
79
|
catch (error) {
|
|
82
|
-
await startOutsideStateLane(() => Promise.all([
|
|
80
|
+
await (0, state_lane_1.startOutsideStateLane)(() => Promise.all([
|
|
83
81
|
start.clientServerLocation?.stop(signal).catch(() => undefined),
|
|
84
82
|
fanoutLocation?.stop(signal).catch(() => undefined)
|
|
85
83
|
]));
|
|
@@ -89,9 +87,9 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
89
87
|
}
|
|
90
88
|
async reclaimLocationOwnerRows(signal) {
|
|
91
89
|
const clientServerLocation = await this.lane.run(() => this.clientServerLocation);
|
|
92
|
-
await startOutsideStateLane(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
90
|
+
await (0, state_lane_1.startOutsideStateLane)(() => clientServerLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
93
91
|
const fanoutLocation = await this.lane.run(() => this.fanoutLocation);
|
|
94
|
-
await startOutsideStateLane(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
92
|
+
await (0, state_lane_1.startOutsideStateLane)(() => fanoutLocation?.reclaimOwnerRows(signal) ?? Promise.resolve());
|
|
95
93
|
}
|
|
96
94
|
bindRouteMeshRouters() {
|
|
97
95
|
for (const routeChannel of this.options.registration.routeChannelOptions.values()) {
|
|
@@ -178,7 +176,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
}
|
|
181
|
-
dispatchMeshChannel(meshName, record, signal) {
|
|
179
|
+
dispatchMeshChannel(meshName, record, signal, admit) {
|
|
182
180
|
const channelName = record.channelName;
|
|
183
181
|
if (channelName === null) {
|
|
184
182
|
throw new configuration_1.ZLinkConfigurationException('MeshNode channel record is missing channelName.');
|
|
@@ -187,14 +185,14 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
187
185
|
if (dispatcher === undefined) {
|
|
188
186
|
throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' channel '${channelName}' has no registered handlers.`);
|
|
189
187
|
}
|
|
190
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
188
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
191
189
|
}
|
|
192
|
-
dispatchMeshRoute(meshName, record, signal) {
|
|
190
|
+
dispatchMeshRoute(meshName, record, signal, admit) {
|
|
193
191
|
const dispatcher = this.meshRouteDispatchers.get(meshName);
|
|
194
192
|
if (dispatcher === undefined) {
|
|
195
193
|
throw new configuration_1.ZLinkConfigurationException(`RouteMesh '${meshName}' has no registered node-direct handlers.`);
|
|
196
194
|
}
|
|
197
|
-
return dispatcher.dispatchMesh(record, signal);
|
|
195
|
+
return dispatcher.dispatchMesh(record, signal, admit);
|
|
198
196
|
}
|
|
199
197
|
dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal) {
|
|
200
198
|
const dispatcher = this.meshRouteDispatchers.get(meshName);
|
|
@@ -211,20 +209,20 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
211
209
|
}
|
|
212
210
|
async disposeCore(signal) {
|
|
213
211
|
const work = await this.lane.run(() => this.beginDisposeCore());
|
|
214
|
-
const transportStopped = await startOutsideStateLane(() => Promise.allSettled([
|
|
212
|
+
const transportStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
|
|
215
213
|
...work.channelLoops.map((loop) => loop.stop()),
|
|
216
214
|
...work.subscriberLoops.map((loop) => loop.stop()),
|
|
217
215
|
...work.routeLoops.map((loop) => loop.stop()),
|
|
218
216
|
...work.manualTransitions
|
|
219
217
|
]));
|
|
220
|
-
const applicationStopped = await startOutsideStateLane(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
|
|
218
|
+
const applicationStopped = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled(work.applicationDispatchQueues.map((queue) => queue.close())));
|
|
221
219
|
const descriptorStopped = work.clientServerLocation === undefined
|
|
222
220
|
? []
|
|
223
|
-
: await startOutsideStateLane(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
|
|
221
|
+
: await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.clientServerLocation?.stop(signal)]));
|
|
224
222
|
const fanoutDescriptorStopped = work.fanoutLocation === undefined
|
|
225
223
|
? []
|
|
226
|
-
: await startOutsideStateLane(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
|
|
227
|
-
const cleanup = await startOutsideStateLane(() => Promise.allSettled([
|
|
224
|
+
: await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([work.fanoutLocation?.stop(signal)]));
|
|
225
|
+
const cleanup = await (0, state_lane_1.startOutsideStateLane)(() => Promise.allSettled([
|
|
228
226
|
...work.spotRouteBridges.map((bridge) => bridge.dispose()),
|
|
229
227
|
this.options.sockets.dispose()
|
|
230
228
|
]));
|
|
@@ -421,7 +419,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
421
419
|
}
|
|
422
420
|
enqueueManualFanoutTransition(state, transition) {
|
|
423
421
|
state.transition = state.transition
|
|
424
|
-
.then(() => startOutsideStateLane(transition), () => startOutsideStateLane(transition))
|
|
422
|
+
.then(() => (0, state_lane_1.startOutsideStateLane)(transition), () => (0, state_lane_1.startOutsideStateLane)(transition))
|
|
425
423
|
.catch((error) => state.taskRunner.errorSink.reportRuntimeTaskException(`subscriber:${state.channelName}:manual:${state.index}:lifecycle`, error));
|
|
426
424
|
}
|
|
427
425
|
openManualFanoutSubscriber(state) {
|
|
@@ -489,13 +487,13 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
489
487
|
return;
|
|
490
488
|
const errors = [];
|
|
491
489
|
try {
|
|
492
|
-
await startOutsideStateLane(() => active.loop.stop());
|
|
490
|
+
await (0, state_lane_1.startOutsideStateLane)(() => active.loop.stop());
|
|
493
491
|
}
|
|
494
492
|
catch (error) {
|
|
495
493
|
errors.push(error);
|
|
496
494
|
}
|
|
497
495
|
try {
|
|
498
|
-
await startOutsideStateLane(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
|
|
496
|
+
await (0, state_lane_1.startOutsideStateLane)(() => this.options.sockets.closeFanoutSubscriberConnection(state.connectionId));
|
|
499
497
|
}
|
|
500
498
|
catch (error) {
|
|
501
499
|
errors.push(error);
|
|
@@ -524,7 +522,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
524
522
|
state.stopping = undefined;
|
|
525
523
|
}
|
|
526
524
|
drainManualFanoutSubscriberCore(state) {
|
|
527
|
-
state.transition = state.transition.then(() => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)), () => startOutsideStateLane(() => this.closeManualFanoutSubscriber(state)));
|
|
525
|
+
state.transition = state.transition.then(() => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)), () => (0, state_lane_1.startOutsideStateLane)(() => this.closeManualFanoutSubscriber(state)));
|
|
528
526
|
return state.transition;
|
|
529
527
|
}
|
|
530
528
|
startFanoutSubscriberLoop(channelName, connectionId, subscriber) {
|
|
@@ -546,7 +544,7 @@ class ZLinkChannelRuntimeLifecycle {
|
|
|
546
544
|
this.subscriberReceiveLoops.push(loop);
|
|
547
545
|
void taskRunner.run(`subscriber:${channelName}:automatic:${connectionId}`, (signal) => loop.run(signal));
|
|
548
546
|
return async () => {
|
|
549
|
-
await startOutsideStateLane(() => loop.stop());
|
|
547
|
+
await (0, state_lane_1.startOutsideStateLane)(() => loop.stop());
|
|
550
548
|
await this.lane.run(() => this.removeSubscriberReceiveLoopCore(loop));
|
|
551
549
|
};
|
|
552
550
|
}
|
|
@@ -651,6 +649,3 @@ function hasFanoutLocationTopology(registration) {
|
|
|
651
649
|
}
|
|
652
650
|
return false;
|
|
653
651
|
}
|
|
654
|
-
function startOutsideStateLane(work) {
|
|
655
|
-
return detachedStateLaneResource.runInAsyncScope(work);
|
|
656
|
-
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ZLinkMeshDispatchAdmission } from '../admission';
|
|
1
2
|
import type { ZLinkListenerRecords } from '../foundation/listener-records';
|
|
2
3
|
import type { ZLinkLocationOptionOverrides } from '../../contracts/Locations/Options';
|
|
3
4
|
import type { RoutingId } from '../../contracts';
|
|
@@ -40,8 +41,8 @@ export declare class ZLinkChannelRuntimeManager {
|
|
|
40
41
|
openMonitoringSource(sourceName: string, adapter: ZLinkMonitoringBackendAdapter): ZLinkBackendSocketMonitor;
|
|
41
42
|
start(taskRunner?: ZLinkRuntimeTaskRunner): Promise<void>[];
|
|
42
43
|
prepareMeshDispatch(taskRunner?: ZLinkRuntimeTaskRunner): void;
|
|
43
|
-
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
44
|
-
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal): Promise<void>;
|
|
44
|
+
dispatchMeshChannel(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
45
|
+
dispatchMeshRoute(meshName: string, record: ReceiveRecord, signal?: AbortSignal, admit?: ZLinkMeshDispatchAdmission): void | Promise<void>;
|
|
45
46
|
dispatchLocalMeshRoute(meshName: string, sourceNodeRid: RoutingId, parts: readonly Message[], signal?: AbortSignal): Promise<void>;
|
|
46
47
|
canDispatchLocalMeshRoute(meshName: string): boolean;
|
|
47
48
|
send(channelName: string, packetName: string | undefined, message: unknown, metadata?: ReadonlyMap<string, string>): Promise<ZLinkSubmitResult>;
|
|
@@ -126,11 +126,11 @@ class ZLinkChannelRuntimeManager {
|
|
|
126
126
|
prepareMeshDispatch(taskRunner) {
|
|
127
127
|
this.lifecycle.prepareMeshDispatch(taskRunner);
|
|
128
128
|
}
|
|
129
|
-
dispatchMeshChannel(meshName, record, signal) {
|
|
130
|
-
return this.lifecycle.dispatchMeshChannel(meshName, record, signal);
|
|
129
|
+
dispatchMeshChannel(meshName, record, signal, admit) {
|
|
130
|
+
return this.lifecycle.dispatchMeshChannel(meshName, record, signal, admit);
|
|
131
131
|
}
|
|
132
|
-
dispatchMeshRoute(meshName, record, signal) {
|
|
133
|
-
return this.lifecycle.dispatchMeshRoute(meshName, record, signal);
|
|
132
|
+
dispatchMeshRoute(meshName, record, signal, admit) {
|
|
133
|
+
return this.lifecycle.dispatchMeshRoute(meshName, record, signal, admit);
|
|
134
134
|
}
|
|
135
135
|
dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal) {
|
|
136
136
|
return this.lifecycle.dispatchLocalMeshRoute(meshName, sourceNodeRid, parts, signal);
|
|
@@ -79,7 +79,6 @@ export declare class ZLinkRuntimeRouteTransport implements ZLinkRouteClientTrans
|
|
|
79
79
|
private submitToChannelScoped;
|
|
80
80
|
requestToChannel<TReply>(meshName: string, channelName: string, packetName: string | undefined, request: unknown, timeoutMs: number | undefined, signal?: AbortSignal, metadata?: ReadonlyMap<string, string>, onAdmitted?: () => void): Promise<TReply>;
|
|
81
81
|
private requestToChannelScoped;
|
|
82
|
-
private submitRequestOperation;
|
|
83
82
|
sendToSpot(spotRouteTarget: ZLinkSpotRouteTarget, message: unknown, options: ZLinkSpotRoutedSendOptions): Promise<ZLinkSubmitResult>;
|
|
84
83
|
private sendToSpotScoped;
|
|
85
84
|
sendFromSpotToSpot(sourceSpot: ZLinkBackendSpot, spotRouteTarget: ZLinkSpotRouteTarget, message: unknown, options: {
|
|
@@ -112,15 +112,18 @@ class ZLinkRuntimeRouteTransport {
|
|
|
112
112
|
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound, `MeshNode '${meshName}' target '${targetNodeRid}' is an Object Client.`);
|
|
113
113
|
}
|
|
114
114
|
const parts = this.encodeMessage(1 /* ZLinkChannelMessageKind.Request */, meshName, packetName, request, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, metadata, correlationId);
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
115
|
+
const requestOptions = { flags: 1, onAdmitted, timeoutMs: requestTimeoutBudget(timeoutMs) };
|
|
116
|
+
let completion;
|
|
117
|
+
try {
|
|
118
|
+
completion = await this.completionTable(meshName).submit(() => {
|
|
119
|
+
const operationId = node.requestToNode((0, routing_id_1.toBackendRoutingId)(targetNodeRid), parts, requestOptions);
|
|
120
|
+
this.traceNodeRequest(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.Sent, undefined, meshName, targetNodeRid, packetName, correlationId);
|
|
121
|
+
return operationId;
|
|
122
|
+
}, signal);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw mapMeshSubmissionError(error, `MeshNode '${meshName}' request to node '${targetNodeRid}'`);
|
|
126
|
+
}
|
|
124
127
|
const reply = this.decodeMeshReply(meshName, completion);
|
|
125
128
|
this.traceNodeRequest(ZLinkDispatchOptions_1.ZLinkRuntimeMessageFlowOutcome.ReplyReceived, 'succeeded', meshName, targetNodeRid, packetName, correlationId);
|
|
126
129
|
return reply;
|
|
@@ -176,37 +179,27 @@ class ZLinkRuntimeRouteTransport {
|
|
|
176
179
|
const parts = this.encodeMessage(1 /* ZLinkChannelMessageKind.Request */, channelName, packetName, request, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS, metadata);
|
|
177
180
|
const metric = this.metrics?.startRequest(meshName, 'channel');
|
|
178
181
|
try {
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}
|
|
182
|
+
const requestOptions = { flags: 1, timeoutMs: requestTimeoutBudget(timeoutMs), onAdmitted };
|
|
183
|
+
let completion;
|
|
184
|
+
try {
|
|
185
|
+
completion = await this.completionTable(meshName).submit(() => node.requestToChannel(channelName, parts, requestOptions), signal);
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
throw mapMeshSubmissionError(error, `MeshNode '${meshName}' request to channel '${channelName}'`);
|
|
189
|
+
}
|
|
184
190
|
const reply = this.decodeMeshReply(meshName, completion);
|
|
185
191
|
metric?.complete('completed');
|
|
186
192
|
return reply;
|
|
187
193
|
}
|
|
188
194
|
catch (error) {
|
|
189
|
-
metric?.complete(requestMetricOutcome(error));
|
|
190
|
-
if (
|
|
195
|
+
metric?.complete(requestMetricOutcome(error, signal));
|
|
196
|
+
if (error instanceof contracts_1.ZLinkFrameworkException &&
|
|
197
|
+
(0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound) {
|
|
191
198
|
this.metrics?.recordChannelSelectionFailure(meshName, channelName, 'no_ready_target');
|
|
192
199
|
}
|
|
193
200
|
throw error;
|
|
194
201
|
}
|
|
195
202
|
}
|
|
196
|
-
async submitRequestOperation(meshName, timeoutMs, signal, operation, attempt) {
|
|
197
|
-
const effectiveTimeoutMs = Math.max(1, timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS);
|
|
198
|
-
const deadlineMs = performance.now() + effectiveTimeoutMs;
|
|
199
|
-
const remainingTimeoutMs = deadlineMs - performance.now();
|
|
200
|
-
if (remainingTimeoutMs <= 0) {
|
|
201
|
-
throw (0, framework_errors_internal_1.createInternalFrameworkException)(framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded, `${operation} timed out before submission.`);
|
|
202
|
-
}
|
|
203
|
-
try {
|
|
204
|
-
return await this.completionTable(meshName).submit(() => attempt(Math.max(1, Math.ceil(remainingTimeoutMs))), signal);
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
throw mapMeshSubmissionError(error, operation);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
203
|
sendToSpot(spotRouteTarget, message, options) {
|
|
211
204
|
return (0, flow_context_1.runWithOutboundFlow)(this.flowCreationEnabled(), () => this.sendToSpotScoped(spotRouteTarget, message, options));
|
|
212
205
|
}
|
|
@@ -428,6 +421,13 @@ function instanceSpotRouteFence(target) {
|
|
|
428
421
|
storeVersion: target.authorityStoreVersion
|
|
429
422
|
};
|
|
430
423
|
}
|
|
424
|
+
/**
|
|
425
|
+
* The binding request timeout for one submission. The binding owns the
|
|
426
|
+
* deadline after submit; the completion table slot only waits for it.
|
|
427
|
+
*/
|
|
428
|
+
function requestTimeoutBudget(timeoutMs) {
|
|
429
|
+
return Math.max(1, Math.ceil(timeoutMs ?? Registration_1.DEFAULT_REQUEST_TIMEOUT_MS));
|
|
430
|
+
}
|
|
431
431
|
function mapMeshSubmitResult(result) {
|
|
432
432
|
return (0, submission_result_1.classifySubmitResult)(result, 'Mesh submission');
|
|
433
433
|
}
|
|
@@ -486,14 +486,16 @@ function meshRequestFailure(meshName, result, nativeErrno) {
|
|
|
486
486
|
});
|
|
487
487
|
return error;
|
|
488
488
|
}
|
|
489
|
-
function requestMetricOutcome(error) {
|
|
489
|
+
function requestMetricOutcome(error, signal) {
|
|
490
490
|
if (error instanceof contracts_1.ZLinkFrameworkException) {
|
|
491
|
-
if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RequestTargetNotFound)
|
|
492
|
-
return 'target_not_found';
|
|
493
491
|
if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.DeadlineExceeded)
|
|
494
492
|
return 'timed_out';
|
|
495
493
|
if ((0, framework_errors_internal_1.internalFrameworkErrorKind)(error) === framework_errors_internal_1.ZLinkFrameworkInternalErrorKind.RuntimeShutdown)
|
|
496
494
|
return 'shutdown';
|
|
497
495
|
}
|
|
496
|
+
if (signal?.aborted === true &&
|
|
497
|
+
(error === signal.reason ||
|
|
498
|
+
(error instanceof Error && (error.cause === signal.reason || error.name === 'AbortError'))))
|
|
499
|
+
return 'cancelled';
|
|
498
500
|
return 'failed';
|
|
499
501
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ZLinkClientServerLocationRuntime = void 0;
|
|
4
|
+
const routing_id_1 = require("../routing-id");
|
|
4
5
|
const RegistrationBuilderPolicy_1 = require("../../contracts/Configuration/RegistrationBuilderPolicy");
|
|
5
6
|
const Locations_1 = require("../../contracts/Locations");
|
|
6
7
|
const Options_1 = require("../../contracts/Locations/Options");
|
|
@@ -91,7 +92,7 @@ class ZLinkClientServerLocationRuntime {
|
|
|
91
92
|
ownerId: owner.ownerId,
|
|
92
93
|
leaseGeneration: owner.leaseGeneration
|
|
93
94
|
};
|
|
94
|
-
const result = await this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Takeover, signal);
|
|
95
|
+
const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Takeover, writeSignal), signal);
|
|
95
96
|
if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
|
|
96
97
|
throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor recovery was fenced.`);
|
|
97
98
|
}
|
|
@@ -115,7 +116,7 @@ class ZLinkClientServerLocationRuntime {
|
|
|
115
116
|
descriptorRevision: current.descriptorRevision + 1n,
|
|
116
117
|
weight: runtimeWeight
|
|
117
118
|
};
|
|
118
|
-
const result = await this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Renew, signal);
|
|
119
|
+
const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(candidate, Locations_1.ZLinkLocationWriteIntent.Renew, writeSignal), signal);
|
|
119
120
|
if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
|
|
120
121
|
throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor renewal was fenced.`);
|
|
121
122
|
}
|
|
@@ -138,7 +139,7 @@ class ZLinkClientServerLocationRuntime {
|
|
|
138
139
|
leaseGeneration: owner.leaseGeneration,
|
|
139
140
|
updatedAt: new Date(0)
|
|
140
141
|
};
|
|
141
|
-
const result = await this.store.updateClientServer(descriptor, Locations_1.ZLinkLocationWriteIntent.NewClaim, signal);
|
|
142
|
+
const result = await this.locationRuntime.writeDescriptor((writeSignal) => this.store.updateClientServer(descriptor, Locations_1.ZLinkLocationWriteIntent.NewClaim, writeSignal), signal);
|
|
142
143
|
if (result.status !== Locations_1.ZLinkLocationWriteStatus.Stored) {
|
|
143
144
|
throw new configuration_1.ZLinkConfigurationException(`ClientServer server '${channelName}' descriptor claim failed with '${result.status}'.`);
|
|
144
145
|
}
|
|
@@ -452,7 +453,7 @@ function requestAdmission(dealer, descriptor, timeoutMs) {
|
|
|
452
453
|
}
|
|
453
454
|
function requireMatchingAdmission(expected, actual) {
|
|
454
455
|
if (actual.channelName !== expected.channelName ||
|
|
455
|
-
actual.serverRid
|
|
456
|
+
!(0, routing_id_1.routingIdsEqual)(actual.serverRid, expected.serverRid) ||
|
|
456
457
|
actual.lifecycleGeneration !== expected.lifecycleGeneration ||
|
|
457
458
|
actual.descriptorRevision !== expected.descriptorRevision ||
|
|
458
459
|
actual.weight !== expected.weight ||
|
|
@@ -4,9 +4,10 @@ import type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port'
|
|
|
4
4
|
export type { ZLinkDispatchErrorSink } from '../diagnostics/dispatch-error-port';
|
|
5
5
|
type ZLinkRuntimeDispatchFailure = ZLinkDispatchFailure & {
|
|
6
6
|
readonly error?: unknown;
|
|
7
|
+
readonly severity?: 'warning';
|
|
7
8
|
};
|
|
8
9
|
export declare class ZLinkDispatchErrorReporter {
|
|
9
|
-
|
|
10
|
+
readonly metrics?: ZLinkRuntimeMetrics | undefined;
|
|
10
11
|
private reportedEvents;
|
|
11
12
|
/**
|
|
12
13
|
* Success-path tracer companion: every surface already receives a reporter, so
|
|
@@ -63,7 +63,8 @@ class ZLinkDispatchErrorReporter {
|
|
|
63
63
|
errorType: errorInfo.errorType,
|
|
64
64
|
errorMessage: errorInfo.errorMessage,
|
|
65
65
|
errorCauseType: errorInfo.errorCauseType,
|
|
66
|
-
errorCauseMessage: errorInfo.errorCauseMessage
|
|
66
|
+
errorCauseMessage: errorInfo.errorCauseMessage,
|
|
67
|
+
severity: normalized.severity
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
captureEnabled() {
|